Бинарное сложение / вычитание - PullRequest
2 голосов
/ 22 сентября 2011

У меня возникли проблемы с пониманием флага переноса (CF) и флага переполнения (OF).

Вот несколько примеров проблем, над которыми я работаю:

1.  1011 1111    2.  1111 0111    3.  0111 1110  -->   0111 1110
  + 1011 0111      + 1101 1101      - 1011 0000  --> + 0100 1111
  ___________      ___________      ___________      +         1
    0111 0110        1101 0100                       ___________
                                                       1100 1110
  1. Выполнение позиции знака равно 1, и перенос в позицию знака 0, поэтому OF = 1?
  2. Выполнение позиции знака равно 1, и перенос в позицию знака равен 1,поэтому OF = 0?
  3. Выполнение позиции знака равно 0, а перенос в позицию знака равен 1, поэтому OF = 1?

Я думаю, у меня возникли проблемыпонимание переполнения без знака и соответствующего значения CF.

1 Ответ

2 голосов
/ 22 сентября 2011

Отказ от ответственности: я не эксперт (или даже пользователь этого уровня кода :)).

Я считаю, что флаг переноса имеет смысл для неподписанных данных, а флаг переполнения имеет смыслдля подписанных данных.

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

From: http://en.wikipedia.org/wiki/Overflow_flag

Внутренне флаг переполнения обычно генерируется исключительным или внутренним переносом в и из знакового бита.Поскольку бит знака совпадает с самым старшим битом числа, считающегося беззнаковым, флаг переполнения является «бессмысленным» и обычно игнорируется, когда такие числа складываются или вычитаются.

Бит знака являетсястарший значащий бит (самый дальний слева).

Исключительно или (XOR):

  • Если ни то, ни другое: 0
  • Если либо: 1
  • Если оба: 0

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

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

XOR эти два значения, и вы должны получить значение дляВаш флаг переполнения после данного добавления.

...