无符号数,没有溢出的问题,只有借位.
8位二进制数,可以表示的无符号数,是 0 255.
做加法,超过了 255,就会进位;
做减法,不够减,就会借位;
这些,就是判断准则.
一旦出现进位、借位,CF 就为 1.
有符号数,没有借位的问题,只有溢出.
8位二进制数,可以表示的无符号数,是 -128 +127.
做加法、减法,超出了这个范围,就会溢出.
这就是判断准则.
一旦出现溢出,OF 就为 1.
这里说的溢出,是指:数值过大,超出了编码所能表示的范围。
本质上,任何形式的计数,都是有可能溢出的。
比如, 2020 年、2021 年...,我们已经习惯用四位数表示年份。
但是到了 9999 年,再过一年,你如果仍然用四位数表示,就会溢出了。
再如:座机的电话号码,七位转八位,就是为了防止溢出。
---------------------
在 Intel 设计的 CPU 中,有两个标志位:CF、OF(Over Flag)。
每当无符号数的运算出现了溢出,就会有 CF=1,翻译过来就是:进位。
每当有符号数溢出了,则 OF=1,称为 OVER,翻译过来就是:溢出。
按照 Intel 的论调,就是说:
所谓的“溢出”,是特指“有符号数的运算”。
无符号数的溢出,就不叫溢出了,必须得叫做“进位”
这说法,有些“反人类”哈!
没有办法,人家是大佬嘛,说的对不对,也必须得这么执行。
---------------------
所以,在计算机领域:
有符号数,才有可能出现溢出的。
溢出的特征,是“符号位出错”。
如:正数+正数,却得出了负数、 ... 。
无符号数,是没有溢出的,它只有“进位借位”。
而有符号数的运算,就不必关心进借位了。