Добавляя два шестнадцатеричных числа, нужно найти флаги Z, N, V ​​и C. Я нашел правильные флаги Z, N, C, но V должно быть 0 вместо 1. Почему? - PullRequest
0 голосов
/ 16 февраля 2020

FA + AB = A5 (Carry of 1, 1A5) C = 1

A5 = A * 16 + 5 * 16 ^ 0 = 165 (не между -127-128, поэтому я думаю, что это переполнение и V = 1, но правильный ответ V = 0)

Другие ответы верны: A5 = 1 0100101, который показывает, что флаг N равен 1. Кроме того, флаг Z равен 0, поскольку А5 отличается от числа 0.

1 Ответ

2 голосов
/ 16 февраля 2020

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, затем инвертируем, добавляем единицу, затем конвертируем это и ставим отрицательный знак , У процессора нет причин делать это, он хочет, чтобы биты были как есть, это только когда мы хотим ВИДЕТЬ, что делает процессор, нам нравится думать в десятичном формате.

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