无符号和有符号数底层溢出判断

无符号和有符号数进行运算,在机器层面上所做运算相同,编译器区分两种运算是否溢出,依赖于CF(carry flag)和OF(over flag)位。

CF(进位标志位)

最高位出现进位置1,否则置0。例:

   1000

 +  1000

———————         CF置1 

 1   0000 

OF(溢出标志位)

最高位和次高位进位不同置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,溢出 

posted @ 2021-01-25 10:55  cynault  阅读(1028)  评论(0编辑  收藏  举报