我一直试图让我的头脑溢出vs进位(对于ARM7,但基本上我的意思是适用于任何东西的术语)。
我想我终于拥有了它 - 但我想检查一下我的“真正的基本理解”是否正确,所有复杂性都被删除了,是否真的只是归结为:
unsigned => V = 0
V = 1 => bit n is incorrect
C = 1 => bit n+1 'exists'
谢谢,
答案 0 :(得分:3)
这些状态位与溢出有关,与unsigned vs twos补码有关。
加法本身是独立的标志,也就是二重奏的美。一个逻辑块可用于无符号和有符号加法和减法。唯一对无符号vs有符号加法或减法有用的地方是溢出位,无符号溢出(a.k.a进位)和有符号溢出(a.k.a溢出)。
自从我们了解了小学入学后,随身携带的位置有望更加明显 7
+4
=====
你需要“携带一个”才能做到这一点。二进制文件完全相同,只是处理器通常具有固定数量的位置,在纸面上,操作的宽度与您有多少纸张有关。
因此,如果设置了msbit的执行,那么对于任何添加,那么存在无符号溢出,我们没有足够的位用于列数。
现在这会导致一些混乱,因为进位也被称为减法,这变成了一个实现的东西,所以我不一定(并且不要亲自)记住那个臂做到这一点,x86做到了,等等但是记得找出二进制补码数的一种方法是“反转并加一”。那么当你想从7中减去5时,你在逻辑中做的是,不是添加-5而是添加5的补码并设置(反转)进位
1 <- invert or set the carry in bit
111 <- 7 (0b111)
+ 010 <- ones complement of 5 (0b101)
=====
然后我们做数学
1111
111
+ 010
=====
010
结果是2(2b010)WITH A CARRY OUT?
不执行并不意味着无符号溢出。当做一个减法时,从溢出的角度来看反向执行。这是一些处理器变化的地方。当操作是减法时,有些将反转进位标志的结果,因此上述alu操作可能导致进位标志为1或进位标志为0,这取决于处理器,这也意味着在进行减法时如果处理器支持它,则进位将在进入时反转或不反转。
那么签名溢出呢?
让我们看一下三位模式
unsigned signed
000 0 0
001 1 1
010 2 2
011 3 3
100 4 -4
101 5 -3
110 6 -2
111 7 -1
因此,例如,如果我们要添加位模式2b011 + 2b010,无符号将是3 + 2 = 5,签名将是3 + 2 = -3 ... ummm,这是错误的。签名溢出会告诉你。执行,无符号溢出将不会为该操作设置,但签名溢出将是。使用x86甚至可能有一半溢出和完全溢出?多个溢出?有人有AL,AH和AX的东西..
反正
0100 < - carry in and out
011
+ 010
======
100
注意进入msbit的进位是1,进位是0,这就是我们检测到有符号溢出的方式。
是的,你可以认为它是错误的,因为标志是错误的。从数学的角度来看,这是错误的,因为没有足够的位来存储答案,所以这个符号是错误的,如果我们有3位加法器,我们会得到7+,没有区别于7 + 5 = 12 = 0b1100的无符号加法5 = 4,执行表明没有足够的空间存储结果的所有位。无符号溢出。