通过添加两个十六进制数,需要找到标志 Z、N、V 和 C。我发现 Z、N、C 标志是正确的,但 V 应该是 0 而不是 1。为什么?

By adding two hexadecimal numbers the flags Z,N,V and C need to be found. I have found Z,N, C flags correct but V should be 0 instead of 1. Why?

FA +AB =A5 (进位 1, 1A5) C=1

A5=A*16+5*16^0=165(不在-127-128之间所以我认为是溢出,V=1但正确答案是V=0)

其他正确答案: A5=10100101,表示N标志为1。 此外,Z 标志为 0,因为 A5 与数字 0 不同。

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.

编辑

V位是SIGNED溢出位,只有当程序员认为这些位是有符号的时候才有意义。 (加减逻辑不一样care/know有符号和无符号的逻辑是一样的,这就是二进制补码的美)。

01111111  127
....
00000100  4
00000011  3
00000010  2
00000001  1
00000000  0
11111111 -1
11111110 -2
11111101 -3
....
10000001 -127
10000000 -128

当你的程序员认为这些位是有符号的,并且正在使用二进制补码(甚至 sign/magnitude),那么当你看到 msbit 集时,这意味着数字是负数。所以我们假设在这个问题中你在谈论 8 位数字,所以 0xFA 当被认为是有符号数时是负数,我如何弄清楚十进制是什么是反转并加一然后转换为十进制。

所以 0xFA 到 0x05 然后加一个 0x06 转换为十进制并添加一个负号所以 -6 0xAB 然后是 0x54+1 (有经验的你可以简单地看一下十六进制数并将它取反并写出倒数)或 0x55 然后我使用我的计算器 -85。 -6 + -85十进制是-91,可以用8位来表示,因为8位,带符号,可以表示+127到-128之间,-91就在这个范围内,所以不会有SIGNED溢出。

我们需要取二进制补码,因为我们从小就在思考小数,并希望将数字视为小数,所以您使用上述过程,另一种方法是在我的计算器中输入 FFFFA,然后在十六进制模式下取反并得到一些ffs 一些 00s 然后 6 所以 0x06,一个更快的方法,在我的计算器上,然后重新输入 06 并转换为十进制。 FFFFAB(根本不需要对它进行符号扩展,只是在我这样做时帮助我)给出 55 然后转换为十进制并取反。

所以我们必须这样做的原因是,如果我们想在十进制思维中理解它并手动执行这就是我们所做的,否则在 table 中查找它,使用程序等来“查看”负数,如果我们想以十进制形式“查看”它,则正数也是如此,然后如果 msbit 为 0,我们将其按原样转换,如果为 1,则反转加一,然后将其转换并放入一个上面有负号。处理器没有理由这样做它想要这些位,只有当我们想看到处理器在做什么时,我们才喜欢用十进制来思考。