原码运算、反码运算、补码运算和溢出

1.原码运算

原码中的符号位仅用来表示数的正、负,不参加运算。进行运算的只是数值部分。原码运算时,应首先比较两个数的符号,若两数的符号相同,则可将两个数的数值相加,最后给结果附上相应的符号;若两数的符号不同,则需比较两数的数值大小,然后将数值较大的数减去数值较小的数,并将数值较大的数的符号作为最后结果的符号。

2.反码运算

由反码的定义可以得到反码加、减运算规则如下:
[S2+S1]反= [S2]反+[S1]反
[S2-S1]反= [S2]反+[-S1]反
反码的加、减运算规则表明:两数和的反码等于两数的反码之和,而两数差的反码也可以用加法来实现。
运算时,符号位和数值位一样参加运算,如果符号位产生进位,则需将此进位加到和数的最低位,称之为“循环进位”。运算结果的符号位为0时,说明是正数的反码,与原码相同;运算结果的符号位为1时,说明是负数的反码,应再对运算结果求反码,才得到原码。

3.补码运算和溢出

补码运算同反码运算一样,两数差的补码可以用两数补码的加法来实现。补码加、减运算规则是:[S2+S1]补=[S2]补+[S1]补[S2-S1]补=[S2]补+[-S1]补补码运算时,不必判断数的正负,符号位直接参与运算能得到正确的结果,如果符号位产生了进位,则此进位可“略去”,符号位进位的自然丢失不会影响结果的正确性。运算结果符号位为0时,说明是正数的补码,与原码相同。运算结果符号位为l,说明是负数的补码,应对结果再求补码才得原码。
从上述的讨论可以看出,原码、反码和补码各有优缺点。原码表示法简单方便,但原码减法必须做真正的减法,不能用加法来代替,因此实现原码运算所需的逻辑电路比较复杂。反码和补码的优点是只需用加法逻辑电路便可实现。并且用补码进行减法运算很方便,它只需进行一次算术相加。而用反码进行减法运算,若符号位产生进位就需进行两次算术相加。而且反码还有一个缺点,就是具有两个零值,这容易在计算过程中产生歧意。
从前面所讲的内容可知,n位二进制数S补码能够表示的有符号整数的范围是:
-2^(n-1) ≤ S ≤ +2^(n-1)-1
n位的补码运算如果结果超出了-2(n-1)~+2(n-1)-1的范围,就称为发生了“溢出”。判断溢出的方法主要根据符号位的进位和最高数值位的进位状态来判断结果有无溢出,设最高位向符号位的进位用CP表示,符号位的进位用CS表示,则有:
若CP⊕CS=0,表示无溢出,溢出标志V=0;
若CP⊕CS=1,表示有溢出,溢出标志V=1。

例1:0111 1111(十进制+127)与 0000 0001(十进制+1)相加
二进制相加的结果为1000 0000,其中最高位(符号位)产生了进位,即C1=1;次高位(数值最高位)未产生进位,即C=0。由于C1≠C,说明这个运算产生了溢出(计算结果为十进制-128)。

例2:0111 1111(十进制+127)与 1000 0001(十进制-127)相加
二进制相加的结果为0000 0000,其中最高位(符号位)产生了进位,即C1=1;次高位(数值最高位)产生了进位,即C=1。由于C1=C,说明这个运算未产生溢出(计算结果为十进制0)。

例3:1000 1111(十进制-113)与 1001 0000(十进制-112)相加
二进制相加的结果为0001 1111,其中最高位(符号位)产生了进位,即C1=1;次高位(数值最高位)未产生进位,即C=0。由于C1≠C,说明这个运算产生了溢出(计算结果为十进制+31)。

发布了156 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44001521/article/details/104355891
今日推荐