Флаг переполнения и переноса

Контекст

Я прочитал в учебнике, что...

Сложение и вычитание не могут привести к переполнению. Цитировать,

Переполнение не может произойти после сложения, если одно число положительное, а другое отрицательное, поскольку добавление положительного числа к отрицательному числу дает результат, величина которого меньше (...).

Однако, преодолев некоторые проблемы, оказалось, что это не так, и я хочу подтвердить, что мои расчеты не являются какой-то ошибкой.

Например, контекст, в котором это применимо, для 4-битного сумматора-вычитателя, где M=1 (это означает вычитание с B), A = 0101 (+5) и B = 1010 (+10).

Взяв дополнение до 2 с B = 0110 (-10) и добавив числа, можно было сделать вычитание.

например, (5)+(-10)

      0 1
+5      0101
-10     0110
-------------
result: 1011
results 2s: 0101 (-5)
C: 0 and V = 1.

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

  1. Бит переполнения установлен несмотря на то, что переполнения нет (число находится в диапазоне)
  2. Учитывая, что диапазон составляет от -8 до 7, не будет ли целое число со знаком и целое число без знака также вызывать переполнение, например. (-1+9)

например,

-1      1110
+9      1001
-------------
result: 1111
result 2s:    0001 (1)

C: 1 and V: 1

Я заметил, что при C = 0 переполнения нет, а при C = 1 происходит переполнение.

Я читал, что отношение переполнения между двумя целыми числами без знака - это флаг переполнения V. С другой стороны, отношение переполнения между двумя целыми числами со знаком связано с флагом переноса C. Может ли это быть связано?

Наконец, обратите внимание, что существует переполнение между целым числом без знака и целым числом со знаком, несмотря на то, что приведенное мной утверждение противоречит этому.

TL;DR

Возможно ли переполнение между добавлением целого числа без знака и целого числа со знаком? Если да, то какое отношение между целым числом без знака и целым числом со знаком будет для переполнения (флаг C или V)?


person Jacky Moon    schedule 04.11.2015    source источник
comment
10 (или -10) уже проблематично в этом контексте, поскольку 4-битное дополнение до двух имеет диапазон [-8, +7]   -  person harold    schedule 04.11.2015
comment
Я тоже именно так и думал. Еще одна странность заключается в том, что расчет работает, несмотря на то, что 10 выходит за пределы допустимого диапазона.   -  person Jacky Moon    schedule 04.11.2015
comment
сложение/вычитание между целым числом со знаком и без знака на самом деле не определено. числа со знаком имеют знаковый бит. Я думаю, что они имели в виду в этой цитате то, что положительное и отрицательное число не приведет к переполнению. они не говорят о числах разного типа.   -  person Catalyst    schedule 04.11.2015
comment
Посмотрите, был ли этот ответ чище для вас stackoverflow.com/a/52508879/124486   -  person Evan Carroll    schedule 26.09.2018


Ответы (2)


«бит переполнения» обычно определяется для сложения или вычитания двух чисел со знаком, при работе с числами со знаком первым битом является знак, поэтому для 4-битного сумматора 7 является самым большим доступным целым числом, когда вы выбираете 10, вы уже выбираете число больше чем ваша поддержка сумматора, 1010 означает не 10, а -6, фактически вы вычитаете -6 из 5, что вызывает переполнение.

person EduardoS    schedule 04.11.2015

Я думаю, что ответ EduardoS в порядке, комментарий Гарольда чище. У вас есть 4 бита. Это представляет

[ -(2**3) , (2**3 - 1) ]

Или, проще говоря,

[ -8, 7 ]

Вы выбираете -10. Но этого не существует в этом диапазоне, поэтому большинство архитектур будут использовать его. Эта упаковка устанавливает переполнение. Давайте расширим битовое поле до 8 бит.

00001010 = 10

Теперь мы отрицаем это и добавляем один

11110110

Теперь вы можете обрезать некоторые из этих 1, так как они по существу расширены знаком, но вы должны сохранить бит знака,

10110

Таким образом, вы должны начать с 5 бит, а не с 4. Без которых вы отбрасываете знаковый бит, и это переполняется.

Теперь, когда это исправлено, что произойдет, если мы добавим

00101 (+5)
10110 (-10)
-----
11011

Теперь бит знака установлен, поэтому инвертируйте и добавьте 1.

11011
00100 (inverted)
00001 (adding 1)
00101 (-5)

Итак, ответ -5, и вы сделали это без переполнения.

Вывод здесь заключается в том, чтобы сделать переполнение положительного числа, которое нужно добавить к нему. Чтобы сделать отрицательное число переполненным, вы должны вычесть из него. Если оба числа имеют разные знаки (и они допустимы), они должны вписываться в одно и то же пространство без переполнения.

person Evan Carroll    schedule 26.09.2018