无符号和有符号数进行运算,在机器层面上所做运算相同,编译器区分两种运算是否溢出,依赖于CF(carry flag)和OF(over flag)位。
最高位出现进位置1,否则置0。例:
1000
+ 1000
——————— CF置1
1 0000
最高位和次高位进位不同置1,相同置0。例:
1000
+ 1000
——————— OF置1
1 0000
1100
+ 1100
——————— OF置0
1 1000
底层不知道运算的数是有无符号,所以将两种情况的溢出判断分别反应到OF和CF标志位。编译器了解是否有符号,若是有符号,查看OF判断溢出。若是无符号,查看CF判断溢出。
设寄存器有4位,有符号数范围(-8~7),无符号数范围(0~15),
1100B+1100B = 1 1000
有符号视角:-4+(-4)= -8,最高位和次高位进位都为1,OF=0,所以无溢出
无符号视角:12+ 12 = 24,最高位进位为1,CF=1,溢出
原文:https://www.cnblogs.com/cynault/p/14324066.html