文章目录
一、什么是原码、反码、补码?
- 原码:人为规定原码的最高位为符号位,正数为0,负数为1,其余所有位为10进制数的绝对值;
- 反码:正数的反码=原码,负数的反码=原码除符号位依次取反;
- 补码:正数的补码=原码,负数的补码=反码+1。
- 移码(又叫增码):不管正负数,移码=补码的符号位取反。
n位补码能表示的范围:
- 有符号数是 -2^(n-1) ~ 2^(n-1) - 1 ;无符号数是 0~2^n - 1。
- y补求(-y)补的法则:对y补包括符号位 “求反且最末位加1”;
例如:y补=00110 ,(-y)补=(y补)全反+1=11001+1=11010。
二、原码、反码、补码运算和溢出
1、原码运算
原码中的符号位仅用来表示数的正、负,不参加运算,进行运算的只是数值部分。原码运算时,应首先比较两个数的符号,若两数的符号相同,则可将两个数的数值相加,最后给结果附上相应的符号;若两数的符号不同,则需比较两数的数值大小,然后将数值较大的数减去数值较小的数,并将数值较大的数的符号作为最后结果的符号。
2、反码运算
反码加、减运算规则:运算时,符号位和数值位一样参加运算,如果符号位产生进位(溢出),则需将此进位加到结果的最低位(结果最后一位加1),称之为“循环进位”。运算结果的符号位为0时,说明是正数的反码,与原码相同;运算结果的符号位为1时,说明是负数的反码,应再对运算结果求反码,才得到原码。
3、补码运算
补码加、减运算规则是:运算时,不必判断数的正负,符号位直接参与运算,能得到正确的结果,如果符号位产生了进位(溢出),此进位可“略去”(丢弃),符号位进位的自然丢失不会影响结果的正确性。运算结果符号位为0时,说明是正数的补码,与原码相同。运算结果符号位为1,说明是负数的补码,应对结果再求补码才得原码。
4、溢出判断
判断溢出的方法主要根据符号位的进位和最高数值位的进位状态来判断结果有无溢出,设最高位向符号位的进位用CP表示,符号位的进位用CS表示,则有:
- 若CP⊕CS=0,表示无溢出,溢出标志V=0;
- 若CP⊕CS=1,表示有溢出,溢出标志V=1。
三、为什么使用反码?
计算机实现加法运算是很容易的,若直接作减法,运算规则很复杂,需要处理借位等等,内部逻辑组件会增多,运算效率很低,所以计算机一般在减去一个数的时候会转换成加上这个被减数的负数,将减法转换成了加法。
原码在执行减法运算时,如:4 - 2 (10进制)= 4 + (-2)= 0 100 + 1 010 (二进制原码) = 1110 (二进制原码)= -6 (10进制),上面例子计算4-2,将4-2转换成4+(-2)并用原码计算,得出的结果错误,原码虽然很直观转换了10进制数,但是计算输出的原码值并不正确,所以计算机不能直接使用原码存储和计算。
为了解决原码执行减法运算出错的问题,出现了反码,反码减法规则为:A - B = A + (-B),如果最高位发生了溢位,则需要在最低位加上1, 例如:
- 4 - 2 (10进制)= 4 + (-2)= 0000 0100 + 1111 1101 (二进制反码) = 1 0000 0001 (二进制反码,发生了溢位)= 0000 0010(最低位加1,二进制反码) = 2(10进制)
- 2 - 2 (10进制)= 2 + (-2)= 0000 0010 + 1111 1101 (二进制反码) = 1111 1111 (二进制反码)=1000 0000(10进制)= - 0 (10进制)
计算机是可以使用反码存储和计算的,早期的计算机如CDC 6000、LINC、PDP-1等都是使用反码的。
四、为什么使用补码?
- 使用反码计算时,0有两种编码,+0 (0000 0000)和 -0 (1111 1111),0带符号是没有任何意义的;
- 反码减法的算法规则比较复杂,需要增加计算机内部逻辑组件额外判断溢位,会影响计算效率。
补码是现代计算机使用的编码格式,解决了上面反码的两个缺点。 补码中0用(0000 0000)表示,可以用(1000 0000)表示-128,能够多表示一个最低数;补码的减法规则比较简单,当发生了溢位,直接丢弃溢位,例如:
- 4 - 2 (10进制)= 4 + (-2)= 0000 0100 + 1111 1110 (二进制补码) = 1 0000 0010 (二进制补码,发生了溢位,直接丢弃溢位)= 0000 0010(二进制补码) = 2(10进制)
- 2 - 2 (10进制)= 2 + (-2)= 0000 0010 + 1111 1110 (二进制补码) = 1 0000 0000(二进制补码,发生了溢位,直接丢弃溢位)= 0000 0000 (二进制补码) = 0(10进制)
在现代计算机系统中,数值一律用补码来表示和存储。相对于反码,补码加法更简单,直接丢弃溢位,不需要针对溢位单独处理,所以用补码做运算效率高。
五、原码、反码、补码优缺点
1、原码
优点:编码简单直观,与真值转换非常方便;
缺点:无法将减法转换成加法运算,如果用原码表示带符号的二进制数,符号位需要单独处理。
2、反码
优点:无需硬件分辨符号位,解决了原码无法执行减法运算的问题;
缺点:0有两种编码,产生二义性,给机器判断0带来了麻烦;反码的算法规则比较复杂,需要增加计算机内部逻辑组件额外判断溢位,会影响运算效率。
3、补码
优点:0只有一种表达方式,能够多表示一个最低数;补码运算过程简单,运算效率高;
缺点:补码使用模N加减法,模2^(n+1)表示丢掉第(n+1)位,比较难理解。
六、总结
1、为什么要有反码?
为了解决原码执行减法运算的问题;
2、为什么要有补码?
为了解决0有两个编码的问题,多出的一个编码可以多表示一个最低位;
3、使用补码的好处是什么?
将符号位和数值一并处理,不需要单独的处理符号位,从而降低了复杂度,利用高位溢出,将减法运算变成加法运算,简化运算的设计。