Игнорируем ли мы переполнение в дополнении до двух?

Я пытаюсь понять переполнение в дополнении до двух, например, сказать, что я пытаюсь убрать эти два двоичных числа: 1111 1000 0100 - 010 111 001 000

Я конвертирую 2-е двоичное число в его эквивалент с двумя дополнениями, а затем просто добавляю его, но я заметил, что это привело к переполнению 1, я просто игнорирую переполнение? или есть правило, которому я должен следовать 1111 1000 0100 + 1010 0011 1000 = (1) 1001 1011 1100


person Wolf    schedule 09.01.2015    source источник


Ответы (2)


Короткий ответ:

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

Длинный ответ:

Вы можете считать, что каждый i-й бит в n-битном дополнении до двух имеет разрядное значение 2^i, для 0 ‹= i n - 1, где бит n - 1 (бит знака) имеет разрядное значение -2^(n - 1 ). Это отрицательное место для бита знака. Если вы вычисляете сумму двух таких чисел, как если бы они были беззнаковыми n-битными двоичными числами, эти случаи прекрасны:

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

Чтобы понять это, проще представить задачу как две отдельные суммы: сумму битов знака и сумму битов значения (других). Переполнение суммы значений дает бит переполнения, разрядное значение которого равно 2^(n-1) -- в точности обратное разрядному значению бита знака -- поэтому такое переполнение отменяет один знаковый бит.

Отрицательный + отрицательный случай требует такой отмены, чтобы результат был представляемым (два знаковых бита + одно переполнение значения = один знаковый бит), а положительный + положительный случай не может обеспечить такую ​​отмену, потому что нет доступного знакового бита для отмены. . В положительном + отрицательном случае происходит переполнение суммы битов значения именно в тех случаях, когда результат неотрицательный; вы можете рассмотреть это, чтобы отменить бит знака отрицательного слагаемого, что дает тот же результат, что игнорирование переполнения общей суммы без знака и переинтерпретация суммы как числа с дополнением до двух.

Остальные случаи дают математические результаты, которые не могут быть представлены в n-битном формате дополнения до двух — либо больше, чем наибольшее представимое число, либо меньше, чем наименьшее. Если игнорировать переполнение, то такие результаты можно распознать по кажущемуся перевороту знака. Что вы будете делать с этим, зависит от стратегии восстановления после ошибок.

person John Bollinger    schedule 09.01.2015

Из статьи Википедии о дополнении 2 в разделе о добавлении на https://en.wikipedia.org/wiki/Two%27s_complement#Addition, насколько я понимаю, перенос за пределы заданной (фиксированной) длины битов (влево) можно игнорировать, но не переполнять, как это определяется, когда два крайних левых бита переноса различны. В статье показано, как поддерживать строку переноса, чтобы узнать, было ли переполнение, и вот простой пример в том же стиле:

В 4-битном дополнении до 2 -2 равно 1110, а +3 равно 0011, поэтому

11110  carry 
 1110  -2
+0011  +3
 ----
10001  which is 0001 or simply 1 ignoring the carry in bit 5 and is 
       safe since the leftmost two bits in the carry row are identical
person Community    schedule 21.06.2015