我很难理解溢出标志。
假设我们正在处理字节值。据我所知,对于有符号字节值,范围是-2 ^ 7到2 ^ 7 - 1
因此,如果我们将十进制120加十进制10,则将设置溢出标志,因此符号标志,零标志将被设置为0并且进位标志也将为0.
这是有道理的。但是,如果我们尝试通过从-127减去1来溢出负数,则溢出标志不会设置。
我认为问题导致我对如何添加负数感到困惑。有人可以帮我解决这个问题吗?谢谢
答案 0 :(得分:2)
更好的是让我们使用4位值。有符号溢出是当进位和执行msbit不匹配时...没有无符号vs签名加法,硬件不知道。签名vs签名是溢出,执行进位标志是无符号溢出。带符号溢出有时称为溢出标志。
所以四位使这更容易看到,它可以扩展到尽可能多的位列(无限)。所以四位无符号我们可以表示数字0到15,签名我们可以从-8到+7。如果我们要说添加无符号值9 + 7应该给我们一个无符号溢出,因为我们不能表示16。
1111
1001
+ 0111
=======
0000
它的结果是0,带有执行,这意味着有符号溢出,但是我们可以使用完全相同的添加来执行带符号的添加-7(1001)和+ 7(0111)
1111
1001
+ 0111
=======
0000
它给出了正确答案的零,msbit的进位和执行都是1,所以它们匹配所以没有符号溢出,因为我们知道因为我们可以在4位编号系统中表示零。 / p>
xy11
1001
+ 0111
=======
0000
y是进位,x是进位。
所以我们可以选择两个相反的数字,有符号值-7 + -7 = -14,我们无法用4位表示
1001
1001
+ 1001
=======
0010
所以我们得到一个带有签名溢出的2。进位和执行msbit不匹配,因此会在处理器状态寄存器中声明溢出标志(对于具有溢出标志的体系结构/处理器)。所以-127 +( - 1)
11111111
10000001
+ 11111111
==========
10000000
-127 - 1 = -128,这是8位有符号系统中的有效数字。 msbit的进位和进位均为1,因此不会设置溢出标志。
减法很简单。这是两个补充的美,我们没有也不需要减去逻辑。 a - b = a +( - b)我们知道,如果用二进制补码来否定一个数,你就“反转并加一”。我们在硬件中做的是在第二个操作数被反转的情况下添加一个add,我们通过使lsbit的进位为1来添加一个。因此,如果我们使用减法运算并且执行-127 - 1意味着反转1并设置进位
111111111 the carry in of the first column is set
10000001
+ 11111110 1 inverted
==========
10000000
微妙但重要的区别。执行位(msb列)然后变为借位,一个意味着没有借用零意味着有借位。 msbit的进位和执行与签名溢出相同。