Почему для чисел со знаком предпочитают два дополнения над знаком и величиной?


201

Мне просто любопытно, есть ли причина, по которой для представления -1 в двоичном виде используется дополнение до двух: переключение битов и добавление 1?

-1 представлен 11111111 (дополнение к двум), а не (для меня более интуитивно понятным) 10000001, который является двоичным 1 с первым битом в качестве отрицательного флага.

Отказ от ответственности: я не полагаюсь на двоичную арифметику для моей работы!


6
FWIW, ваш «интуитивный» метод использования знакового бита используется иногда - например, большинство компьютеров используют знаковый бит при представлении чисел с плавающей запятой.
Adisak

2
@ Adisak Это называется подписанной величиной
Коул Джонсон

2
Я всегда ассоциировал представление знака и величины с целыми числами, поскольку числа с плавающей точкой содержат три компонента: знак, показатель степени и мантиссу (часто с неявным «1»). Но я полагаю, что достаточно легко относиться к показателю степени и мантиссе как к величине, пока кто-то понимает, что они не являются строго линейными.
Adisak,

Вот статья, обсуждающая, как числа с плавающей точкой хранятся в двоичном виде, для тех, кому интересно замечания @ Adisak.
GDP2

Только что увидел хорошее видео, объясняющее это youtube.com/watch?v=dHB7jFjESLY
19

Ответы:


333

Это сделано для того, чтобы сложение не нуждалось в специальной логике для работы с отрицательными числами. Проверьте статью в Википедии .

Скажем, у вас есть два числа, 2 и -1. В вашем «интуитивном» способе представления чисел они были бы 0010и 1001, соответственно (я придерживаюсь размера 4 бита). В дополнение друг к другу, они есть 0010и 1111. Теперь, допустим, я хочу добавить их.

Дополнение дополнения двух очень просто. Вы обычно добавляете числа, и любой бит переноса в конце отбрасывается. Поэтому они добавлены следующим образом:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 равен 1, что является ожидаемым результатом "2 + (- 1)".

Но в вашем «интуитивном» методе добавление сложнее:

  0010
+ 1001
= 1011

Какой -3, верно? Простое дополнение не работает в этом случае. Вы должны отметить, что одно из чисел является отрицательным и использовать другой алгоритм, если это так.

Для этого «интуитивного» метода хранения вычитание - это операция, отличная от сложения, требующая дополнительных проверок чисел перед их добавлением. Поскольку вы хотите, чтобы основные операции (сложение, вычитание и т. Д.) Выполнялись как можно быстрее, вам нужно хранить числа таким образом, чтобы вы могли использовать самые простые алгоритмы.

Кроме того, в «интуитивном» методе хранения есть два нуля:

0000  "zero"
1000  "negative zero"

Которые интуитивно одинаковы, но при хранении имеют два разных значения. Каждое приложение должно будет предпринять дополнительные шаги, чтобы убедиться, что ненулевые значения также не являются отрицательными нулями.

Есть еще один бонус с хранением целых значений таким образом, и именно тогда вам нужно увеличить ширину регистра, в котором хранится значение. С дополнением к двум, сохранение 4-битного числа в 8-битном регистре является вопросом повторения его самый важный бит:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

Это просто вопрос взгляда на знаковый бит меньшего слова и повторения его, пока он не увеличит ширину большего слова.

При использовании вашего метода вам необходимо очистить существующий бит, который является дополнительной операцией в дополнение к заполнению:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Вам все еще нужно установить эти дополнительные 4 бита в обоих случаях, но в «интуитивном» случае вам также необходимо очистить 5-й бит. Это один крошечный дополнительный шаг в одной из самых фундаментальных и распространенных операций, присутствующих в каждом приложении.


13
Я согласен. 2-е дополнения работ. Но как мы к этому пришли в первую очередь? Если предположить, что мне нужно прийти к этой записи, каков будет процесс мышления. Я думаю, что прибытие в дополнение 2 должно быть больше, чем просто удача, не так ли?
Lazer

1
Кроме того, почему нет двойного дополнения для поплавков?
Lazer

6
@Lazer проверьте эту статью, чтобы узнать how we arrived at 2s compliment the first place. cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
Ankit

1
Насколько я знаю, Java имеет только целочисленные типы со знаком, поэтому она всегда рассматривает его в интерпретации двух дополнений. В других языках способ обработки значения зависит от того, как код обрабатывает его. Там нет ничего, чтобы сказать вам, что блок памяти представляет собой целое число со знаком или без знака или двойное число или строку или что-то еще. Необработанные данные - это любой тип, который вы выбрали для интерпретации.
Welbog

3
@Suraj, я предлагаю посмотреть статью в Википедии о дополнении к двум для полного ответа: en.wikipedia.org/wiki/Two%27s_complement . Короткий ответ СЗБ 1показывает -8, а остальные три 1s указывают 4, 2и 1, соответственно, так -8+4+2+1 = -1.
Welbog

18

Википедия говорит все это:

Преимущество системы двойного дополнения состоит в том, что не требуется, чтобы схема сложения и вычитания проверяла знаки операндов, чтобы определить, следует ли сложить или вычесть. Это свойство делает систему более простой в реализации и способной легко обрабатывать арифметику с более высокой точностью. Кроме того, ноль имеет только одно представление, устраняя тонкости, связанные с отрицательным нулем, который существует в системах дополнения.

Другими словами, добавление одинаково, независимо от того, является ли число отрицательным.


Сэр, если я напишу char a = 12; и unsigned char b = 12, является ли основной битовый шаблон тем же, что на самом деле происходит?
Сурадж Джейн

Ничего не меняется, когда пишет или читает. Применяется только при сложении или вычитании.
Talespin_Kit

12

Хотя этот вопрос старый, позвольте мне поставить свои 2 цента.

Прежде чем я объясню это, давайте вернемся к основам. 2 'дополнение - 1 дополнение + 1. Теперь, что такое дополнение 1 и каково его значение в дополнение.

Сумма любого n-битного числа и его дополнения 1 дает вам максимально возможное число, которое может быть представлено этими n-битами. Пример:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Что будет, если мы попытаемся добавить еще 1 к результату. Это приведет к переполнению.

Результат будет 1 0000равен 0 (так как мы работаем с 4-битными числами (1 слева - переполнение)

Так ,

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

Затем кто-то решил назвать дополнение 1 + 1 как дополнение 2. Таким образом, вышеприведенное утверждение становится следующим: любое n-битное число + его дополнение 2 = 0, что означает дополнение 2 числа = - (этого числа)

Все это приводит к еще одному вопросу: почему мы можем использовать только (n-1) из n битов для представления положительного числа и почему самый левый n-й бит представляет знак (0 на крайнем левом бите означает + ve число, а 1 означает -вый номер). например, почему мы используем только первые 31 бит типа int в java для представления положительного числа, если 32-й бит равен 1, то есть -ve.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (результат равен нулю, переполнение переноса 1)

Таким образом, система (n + 2'полнение n) = 0 все еще работает. Единственная двусмысленность здесь состоит в том, что дополнение 2 к 12 равно 0100, что также неоднозначно представляет +8, кроме представления -12 в системе дополнения 2s.

Эта проблема будет решена, если положительные числа всегда имеют 0 в левом крайнем углу. В этом случае их дополнение 2 всегда будет иметь 1 в левом крайнем бите, и мы не будем иметь неоднозначность того же набора битов, представляющих номер дополнения 2, а также номер + ve.


1
Добавили +1. Это была информация, однако, в конце концов, я не уверен, почему вы хотели использовать подход наиболее значимого бита для представления положительного или отрицательного числа. Он имеет много проблем, например, 0 будет иметь 2 представления - 0000 (+) и 1000 (-). Также сложение и вычитание не могут быть выполнены с использованием одного и того же алгоритма. Когда вы говорите нормальный 0100, тогда это +8, а когда вы говорите, что два дополняют 0100, тогда это -12 ..
hagrawal

8

Дополнение Two позволяет сложению и вычитанию выполняться обычным образом (например, для чисел без знака). Он также предотвращает -0 (отдельный способ представления 0, который не будет равен 0 при обычном побитовом методе сравнения чисел).


6

это для упрощения сумм и разностей чисел. сумма отрицательного числа и положительного числа, кодифицированного в 2-х дополнениях, равна сумме их обычного суммирования.


5

Обычная реализация операции - «перевернуть биты и добавить 1», но есть другой способ определить его, который, вероятно, делает обоснование более ясным. Дополнение 2 - это форма, которую вы получите, если взять обычное представление без знака, где каждый бит контролирует следующую степень 2, и просто сделать наиболее значимый член отрицательным.

Принимая 8-битное значение a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

Обычная двоичная интерпретация без знака:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

Интерпретация двух дополнений:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

Ни один из других битов не меняет значения вообще, и перенос в 7 является «переполнением» и не должен работать, так что почти все арифметические операции работают без изменений (как отметили другие). Величина знака обычно проверяет бит знака и использует другую логику.


4

Дополнение Two позволяет добавлять отрицательные и положительные числа без какой-либо специальной логики.

Если вы попытались добавить 1 и -1, используя ваш метод
10000001 (-1)
+00000001 (1),
вы получите
10000010 (-2)

Вместо этого, используя два дополнения, мы можем добавить

11111111 (-1)
+00000001 (1) вы получите
00000000 (0)

То же самое относится и к вычитанию.

Кроме того, если вы попытаетесь вычесть 4 из 6 (два положительных числа), вы можете дополнить 2 до 4 и сложить их вместе 6 + (-4) = 6 - 4 = 2

Это означает, что вычитание и сложение как положительных, так и отрицательных чисел могут быть выполнены одной и той же схемой в процессоре.


4

Чтобы расширить на другие ответы:

В двух дополнениях

  • Добавление является тем же механизмом, что и добавление простых положительных целых чисел.
  • Вычитание тоже не меняется
  • Умножение тоже!

Деление требует другого механизма.

Все это верно, потому что дополнение к двум - это просто нормальная модульная арифметика, где мы выбираем смотреть на некоторые числа как отрицательные, вычитая по модулю.


Не только умножение без расширения одинаково . Но так как большинство языков высокого уровня не поддерживают расширение умножения без явного приведения, результат будет таким же в этих языках.
phuclv

@ LưuVĩnhPhúc: Расширяющее умножение обычно будет одинаковым, но результаты для знакового и беззнакового умножения гарантированно будут одинаковыми, только если результат будет соответствовать диапазону со знаком int. Некоторые компиляторы, такие как gcc, дают что-то вроде unsigned mul(unsigned short x, unsigned short y) { return x*y; }[16-bit short; 32-разрядный тип int] иногда генерирует код, который будет работать со сбоями, если продукт больше 2147483647.
суперкат

2

Читая ответы на этот вопрос, я наткнулся на этот комментарий [отредактировано].

Дополнение 2 к 0100 (4) будет 1100. Теперь 1100 - это 12, если я скажу нормально. Итак, когда я говорю нормальное 1100, тогда это 12, но когда я говорю, что 2 дополняют 1100, тогда это -4? Кроме того, в Java, когда хранится 1100 (предположим, что на данный момент 4 бита), то как определяется, что это +12 или -4 ?? - Хагравал 2 июля в 16:53

На мой взгляд, вопрос, заданный в этом комментарии, довольно интересен, и поэтому я хотел бы сначала перефразировать его, а затем дать ответ и пример.

ВОПРОС - Как система может установить, как один или несколько смежных байтов должны интерпретироваться? В частности, как система может установить, является ли данная последовательность байтов простым двоичным числом или номером дополнения 2?

ОТВЕТ - Система устанавливает, как интерпретировать последовательность байтов через типы. Типы определяют

  • сколько байтов нужно учитывать
  • как эти байты должны быть интерпретированы

ПРИМЕР - Ниже мы предполагаем, что

  • charдлиной 1 байт
  • shortдлиной 2 байта
  • ints и floats длиной 4 байта

Обратите внимание, что эти размеры относятся к моей системе. Хотя они довольно распространены, они могут отличаться от системы к системе. Если вам интересно, что они в вашей системе, используйте оператор sizeof .

Прежде всего, мы определяем массив, содержащий 4 байта, и инициализируем их все двоичным числом 10111101, соответствующим шестнадцатеричному числу BD.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

Затем мы читаем содержимое массива, используя разные типы.

unsigned char и signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short и short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, intиfloat

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

4 байта в оперативной памяти (l_Just4Bytes[ 0..3 ] ) всегда остаются одинаковыми. Единственное, что меняется, это то, как мы их интерпретируем.

Опять же, мы говорим системе, как интерпретировать их через типы .

Например, выше мы использовали следующие типы для интерпретации содержимого l_Just4Bytesмассива

  • unsigned char: 1 байт в простом двоичном
  • signed char: 1 байт в 2-х дополнениях
  • unsigned short: 2 байта в простой двоичной записи
  • short: 2 байта в дополнении 2
  • unsigned int: 4 байта в простой двоичной записи
  • int: 4 байта в дополнении 2
  • float: 4 байта в нотации IEEE 754 с одинарной точностью

[EDIT] Это сообщение было отредактировано после комментария user4581301. Спасибо, что нашли время, чтобы отбросить эти несколько полезных строк!


Этот блок кода нуждается в редактировании, чтобы читателям не приходилось прокручивать их вперед и назад. Более того, этот массивный комментарий вверху должен стать простым старым текстом и позволить средству визуализации позаботиться о форматировании. Вы также должны добавить предостережение к биту в конце, где вы обсуждаете размеры и форматирование, потому что размеры не фиксированы.
user4581301

+1. @ Mw215, вы могли бы подумать о том, чтобы сделать эту пару вопросов / ответов самостоятельной вики-страницей сообщества, поскольку она полезна для людей, которые могут быть заинтересованы в необработанной байтовой интерпретации вне контекста математики дополнения двух.
Welbog

Я просто хочу знать, что дополнение 2 всегда следует, я имею в виду, если у меня есть int x = -4, и я тогда делаю, printf("%d" , x)как это интерпретируется? Кроме того, в чем разница между unsigned intи signed intи %dи %u... это беспокоило меня в течение длительного времени. Спасибо.
Сурадж Джейн

@Suraj Jain При использовании intтипов signedмодификатор по умолчанию. Это значит, что intи signed intони абсолютно одинакового типа. Таким образом , эти два определения int i = -4;и signed int i = -4;имеет тот же смысл.
mw215

@Suraj Jain Система устанавливает, как интерпретировать последовательность байтов через типы. Типы определяют: сколько байтов должно учитываться и как эти байты должны интерпретироваться. Значение An intсоставляет 4 байта в дополнении 2, а значение unsigned int4 - в простой двоичной записи (проверьте фактический размер шрифта в вашей системе с помощью sizeofоператора).
mw215

1

Вы можете посмотреть, как профессор Джерри Кейн из Стэнфорда объясняет их дополнение во второй лекции (объяснение относительно дополнения 2 начинается около 13:00) в серии лекций под названием «Парадигмы программирования», доступных для просмотра на канале Standford на YouTube. Вот ссылка на серию лекций: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .


0

Дополнение Two используется потому, что его проще реализовать в схемах, а также не допускает отрицательный ноль.

Если есть x битов, два дополнения будут в диапазоне от + (2 ^ x / 2 + 1) до - (2 ^ x / 2). Его дополнение будет работать от + (2 ^ x / 2) до - (2 ^ x / 2), но разрешит отрицательный ноль (0000 равно 1000 в системе дополнения 4 бита 1).


0

Ну, на самом деле ваше намерение не в том, чтобы обратить все биты вашего двоичного числа. Фактически вычитать каждую цифру из 1. Это просто удачное совпадение, что вычитание 1 из 1 приводит к 0, а вычитание 0 из 1 - 1. Таким образом, переворачивание битов эффективно выполняет это вычитание.

Но почему вы находите разницу каждой цифры от 1? Ну, нет. Ваше реальное намерение - вычислить разницу данного двоичного числа от другого двоичного числа, которое имеет такое же количество цифр, но содержит только 1. Например, если ваш номер 10110001, когда вы переворачиваете все эти биты, вы эффективно вычисляете (11111111 - 10110001).

Это объясняет первый шаг в вычислении дополнения двух. Теперь давайте включим второй шаг - добавление 1 - также на картинке.

Добавьте 1 к приведенному выше двоичному уравнению:

11111111 - 10110001 + 1

Что вы получаете? Это:

100000000 - 10110001

Это последнее уравнение. Выполняя эти два шага, вы пытаетесь найти это, последнее различие: двоичное число, вычитаемое из другого двоичного числа с одной дополнительной цифрой и содержащее нули, за исключением позиции бита наибольшего значения.

Но почему мы действительно жаждем этой разницы? Ну, с этого момента, я думаю, будет лучше, если вы прочитаете статью в Википедии .


0

Мы выполняем только операции сложения как для сложения, так и для вычитания. Мы добавляем второй операнд к первому операнду для добавления. Для вычитания мы добавляем дополнение 2 второго операнда к первому операнду.

С представлением дополнения в 2 нам не нужны отдельные цифровые компоненты для вычитания - используются только сумматоры и дополнители.


0

Стоит отметить, что на некоторых ранних машинах добавления, до дней цифровых компьютеров, вычитание выполнялось, когда оператор вводил значения, используя разные цветные условные обозначения для каждой клавиши (так, чтобы каждая клавиша вводила девять минус число, которое будет вычесть), и нажмите специальную кнопку, будет принимать перенос в расчет. Таким образом, на шестизначном компьютере, чтобы вычесть 1234 из значения, оператор нажимал бы на клавиши, которые обычно указывали бы «998,765», и нажимал кнопку, чтобы добавить это значение плюс один к текущему вычислению. Арифметика дополнения двух - это просто двоичный эквивалент этой ранней арифметики «дополнения десятки».


0

Преимущество выполнения вычитания методом дополнения заключается в уменьшении
сложности аппаратного обеспечения. Нет необходимости в разных цифровых схемах для сложения и вычитания. Оба сложения и вычитания выполняются только сумматором.


0

Основное преимущество представления с двумя дополнительными числами, которое здесь еще не было упомянуто, состоит в том, что младшие биты суммы, разности или произведения с двумя дополнительными дополнениями зависят только от соответствующих битов операндов. Причина того, что 8-битное значение со знаком для -1 состоит в 11111111том, что вычитание любого целого числа, чьи младшие 8 битов получены 00000001из любого другого целого числа, чьи младшие 8 битов 0000000будут, даст целое число, чьи младшие 8 битов равны11111111, Математически, значение -1 будет бесконечной строкой из 1, но все значения в пределах диапазона определенного целочисленного типа будут либо всеми 1, либо всеми 0 после определенной точки, поэтому компьютерам удобно "расширять знак" старший значащий бит числа, как если бы он представлял собой бесконечное число единиц или нулей.

Дополнение Two - это почти единственное представление числа со знаком, которое хорошо работает при работе с типами, превышающими естественный размер слова двоичной машины, поскольку при выполнении сложения или вычитания код может извлекать наименьшую порцию каждого операнда, вычисляя наименьшую порцию результат и сохраните его, затем загрузите следующий фрагмент каждого операнда, вычислите следующий фрагмент результата, сохраните его и т. д. Таким образом, даже процессор, который требует, чтобы все сложения и вычитания проходили через один 8-битный регистр может обрабатывать 32-разрядные числа со знаком достаточно эффективно (медленнее, чем с 32-разрядным регистром, конечно, но все же работоспособно).

При использовании любых других представлений со знаком, разрешенных Стандартом C, каждый бит результата может потенциально зависеть от любого бита операндов, что делает необходимым либо хранить целое значение в регистрах сразу, либо выполнять последующие вычисления с дополнительными шаг, который, по крайней мере, в некоторых случаях потребует чтения, изменения и перезаписи каждого фрагмента результата.


Пожалуйста, отформатируйте свой ответ в пункте и отметьте код как код, он будет более читабельным, и вы получите upvote.
Сурадж Джейн

@SurajJain: это лучше?
суперкат

Да, лучше, чем это было раньше, я хочу спросить вас одну вещь: в чем разница между знаковым char a = 1 и unsigned char a = 1, как они представлены в памяти.
Сурадж Джейн

@SurajJain: В системах с двумя дополнительными компонентами, где «char» меньше, чем «int» [то есть в подавляющем большинстве систем], типы знаков со знаком и без знака будут вести себя одинаково, за исключением того, что типы со знаком будут расширяться знаком при чтении и без знака. не будет. В такой системе сохранение значения 194 или -62 в знаковый символ будет записывать ту же битовую комбинацию, что и сохранение 194 или -62 в неподписанный символ (т.е. 11000010). Чтение этого битового шаблона из подписанного символа даст -62, а чтение из неподписанного символа даст 194.
суперкат

означает расширенный знак?
Сурадж Джейн

0

Существуют различные типы представлений:

  1. представление числа без знака
  2. представление числа с подписью
  3. свое дополняющее представление
  4. Дополняющее представление двух

Представление чисел без знака используется для представления только положительных чисел

Представление чисел со знаком используется для представления положительного, а также отрицательного числа. В представлении числа со знаком MSB бит представляет собой знаковый бит, а остальные биты представляют число. Когда MSB равен 0, это означает, что число положительное, а когда MSB равно 1, это означает, что число является отрицательным.

Проблема с представлением чисел со знаком состоит в том, что есть два значения для 0.

Проблема с представлением дополнения состоит в том, что есть два значения для 0.

Но если мы используем представление дополнения Two, тогда будет только одно значение для 0, поэтому мы представляем отрицательные числа в форме дополнения к двум.

Источник: почему отрицательные числа хранятся в двух дополнительных байтах в гигабайтах


-1

Один из удовлетворительных ответов о том, почему Дополнение Two2 используется для представления отрицательных чисел, а не системы Дополнения One, состоит в том, что система Дополнения Two решает проблему множественных представлений 0 и необходимость сквозного переноса, которые существуют в системе дополнения One для представления отрицательных чисел. номера.

Для получения дополнительной информации посетите https://en.wikipedia.org/wiki/Signed_number_representations

Для сквозного переноса Посетите https://en.wikipedia.org/wiki/End-around_carry


на самом деле, если у вас есть десятичная точка и вы явно указываете, что представляют собой все биты: «0..0000.1111..1» означает, что все самые левые неустановленные биты равны 0, а все самые правые неустановленные биты равны 1, и поэтому «..1» означает, что перенос сработал. Поэтому это (механически) "0.0001.0000..0". Это означает, что «1..1111.1111..1» равно нулю! Это также означает, что для отрицания целого числа вы действительно просто переворачиваете его биты. Но теперь это относится к представимым дробям.
Роб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.