概念:
- 机器数(真值):一个数在计算机中的二进制表示形式。机器数带符号,正数最高位为0,负数最高位为1。
- 原码:符号位加上真值的绝对值。
- 反码:正数的反码是其本身,负数的反码是在其基础上,符号位不变,其余各位取反。
- 补码:正数的补码是其本身,负数的补码是在原码的基础上,符号位不变,其余各位取反,最后加1。即补码是反码的基础上加1。
- 原码的减法运算:
发现用带符号位的原码在加减运算的时候就出现问题,如下(假设字长为8bits):
(1)10- (1)10 = (1)10 + (-1)10 = (0)10
(00000001)原 + (10000001)原 = (10000010)原 = (-2)原 // 不正确
因为在两个整数的加法运算中是没有问题的,问题出现在带符号位的负数身上
对除符号位外的其余各位逐位取反就产生了
反码。反码的取值空间和原码相同且一一对应。‘’
- 反码的减法运算:
(1)10 - (1) 10= (1) 10+ (-1) 10= (0)10
(00000001) 反+ (11111110)反 = (11111111)反 = (-0) // 存在 - 0 ,有问题
(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10
(00000001) 反+ (11111101)反 = (11111110)反 = (-1) // 正确
问题出现在+0和-0上,0是没有正负之分的。于是就引入了
补码概念。 在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个。
- 补码的加减运算:
(1) 10- (1) 10= (1)10 + (-1)10 = (0)10
(00000001)补 + (11111111)补 = (00000000)补 = (0) // 正确
(1) 10- (2) 10= (1)10 + (-2)10 = (-1)10
(00000001) 补+ (11111110) 补= (11111111)补 = (-1) // 正确
功能与目的:
- 反码:解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则;
- 补码:解决负数加法运算正负零问题,弥补了反码的不足。
反码与补码都是为了解决
负数运算问题,跟正数没关系,因此,不管是正整数还是正小数,原码,反码,补码都全部相同。
总结:
1、正数的原码、补码、反码均为其本身;
2、负数(二进制)的原码、补码、反码公式:
反码 = 原码(除符号位外)每位取反
补码 = 反码 + 1
反码 = 补码 - 1