进位和溢出的概念在理解计算机补码运算中非常重要,往往在汇编中都会遇到,在计算机组成原理、数字逻辑等课程中也会遇到。
在此之前,先要弄清楚有符号数和无符号数:以八位二进制数为例,有符号数一般用最高位来表示符号位,其余七位为数值位;而无符号数则没有符号位。

1. 无符号数

1.1 范围:

0 ~ 255

1.2 进位判断

首先,对无符号数来说 ,它只有进位或借位

即: 做加法运算时,他的最高位向上形成进位

或者:做减法运算时,他的最高位向上形成借位

==进位不是错误,在他能够表示的范围里,结果仍然正确==

举例: 1000 1111 (143) + 1010 0101 (165) = ==(1)== 0011 0100 (308)

由于结果只能显示8位,所以自动舍去括号里的进位。对于这个结果来说,

在他能够表示的8位范围里,他仍然是正确的。

2. 有符号数

2.1 范围:

-128 ~ +127

其中:最高位是符号位,所以数值位实际上只有7位

而对有符号数来说 ,它只有溢出

即: 做加减法运算时,他的运算结果超出能表示的范围。

举例: ==(1)== 000 0001 (-127) + ==(1)== 010 0110 (-90) = ==(0)== 010 0111 (+39)

事实上结果应该为:-127 + (-90) = -217,

但是 -217 超出他所能表示的范围,即溢出。并且,从运算结果来看,也是不正确的。

总结

溢出标志OF和进位标志CF是两个意义不同的标志.

进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;

溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确

两个同符号数相加,才可能产生溢出。两个符号相异的数相加不可能产生溢出。

计算机对进位位的判断规则为:两个带符号数进行补码加减运算时,通常用符号位产生的进位(S代表)与最高有效数值位向符号位产生的进位(Cy代表)进行异或操作,若异或结果为1则发生溢出,反之则无溢出发生。OV = S + Cy 。以8位二进制为例,OV = Cy7 + Cy6 。