FA + AB
0
11111010
+10101011
==========
111110100
11111010
+10101011
==========
10100101
мсбиты операндов одинаковы, а результат такой же, как у этих операндов, поэтому это не переполнение со знаком. Другим эквивалентным тестом является то, что перенос и выведение msbit одинаковы (оба 1 с), поэтому переполнение со знаком отсутствует.
0xFA + 0xAB = 0xA5
-6 + -85 = -91
, что не является переполнением со знаком.
N установлено, потому что установлен msbit ответа, C устанавливается из-за выполнения (переполнение без знака, которое является правильным 250 + 171 = 421). И ответ не равен нулю, поэтому Z = 0.
EDIT
Бит V является битом переполнения SIGNED, он имеет значение только тогда, когда программист считает эти биты знаковыми. (для сложения и вычитания logi c не заботится / не знает о подписанных и неподписанных, logi c - это то же самое, в чем прелесть дополнения к двум).
01111111 127
....
00000100 4
00000011 3
00000010 2
00000001 1
00000000 0
11111111 -1
11111110 -2
11111101 -3
....
10000001 -127
10000000 -128
, когда вы программист биты, которые должны быть подписаны, и используют двойное дополнение (или даже знак / величину), затем, когда вы видите набор мсбит, который означает, что число является отрицательным. Итак, мы предполагаем, что здесь в этом вопросе вы говорите о 8-битных числах, поэтому 0xFA, если считать число со знаком, отрицательно, как я выясняю, что это десятичное число, инвертировано, и добавляю одно, а затем преобразуем в десятичное число. Итак, от 0xFA до 0x05, затем добавьте одно преобразование 0x06 в десятичное и добавьте отрицательный знак, так что -6 0xAB будет 0x54 + 1 (с опытом вы можете просто посмотреть на шестнадцатеричное число и инвертировать его и написать перевернутое число) или 0x55, тогда я использую мой калькулятор -85. -6 + -85 в десятичном виде это -91, который может быть представлен в 8 битах, потому что 8 битов со знаком могут представлять между +127 и -128, -91 попадает в этот диапазон, поэтому переполнение SIGNED отсутствует.
Нам нужно взять дополнение двойки, потому что мы выросли, думая о десятичной дроби, и хотим видеть число как десятичное, поэтому вы используете вышеописанный процесс, другой способ - набрать в моем калькуляторе FFFFA, затем отрицать в шестнадцатеричном режиме и получить некоторые ffs some 00s, затем 6, поэтому 0x06, более быстрый способ, на моем калькуляторе, затем просто введите только 06 и преобразовайте в десятичную. FFFFAB (на самом деле вообще не нужно расширять его, просто помогает мне, когда я это делаю) дает 55, затем конвертирует в десятичную и отрицает.
Итак, ПОЧЕМУ мы должны это сделать, потому что, если мы хотим понять это в наших десятичных умах и делаем это вручную, это то, что мы делаем, в противном случае ищите это в таблице, используйте программу и т. Д. c. «видеть» отрицательное число, то же самое относится и к положительному, если мы хотим «видеть» его в десятичном виде, тогда, если msbit равен 0, мы конвертируем его как есть, если 1, затем инвертируем, добавляем единицу, затем конвертируем это и ставим отрицательный знак , У процессора нет причин делать это, он хочет, чтобы биты были как есть, это только когда мы хотим ВИДЕТЬ, что делает процессор, нам нравится думать в десятичном формате.