原码
将最高位用作符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值表示形式
例如+1:00000001,-1:1000 0001
再直接使用原码在计算时会有麻烦,十进制1和-1相加得0,但是二进制原码相加
(0000 0001)2+(1000 0001)2=(10000010)2,结果得-2,所以,使用原码直接参数计算可能会出现错误的结果,故而原码的符号位不能直接参与计算,必须和其他位分开,这样会增加硬件的开销
反码
正数的反码与原码相同,负数的反码符号位为1,其余各位为该数绝对值的原码按位取反
例如-1:1111 1110,第一个“1”是符号位不变,后面的“111 1110”则是由原码“000 0001”取反得到,即“1”换成“0”,“0”换为“1”得到。
由于,(0000 0001)2+(1111 1110)2=(1111 1111)2,其中(1111 1111)2是负0,由于普通观念中,0不分正负,故反码的符号位可直接参与计算。
补码
正数的补码与原码形同,负数的补码是该数的反码加1,即补“1”
例-1:1111 1111是由1000 0001转换成反码11111110,再补“1”
(1111 1110)2+(0000 0001)2=(0000 0000)2,直接使用补码进行计算的结果也是正确的,故而补码的符号位也可以直接参与计算
对于一个补码表示的数,要计算其原码,只要对它再次求补即可得到该数的原码
移码
移码是对补码的符号位取反得到的,只用于表示浮点数的阶码
例如-1:0111 1111
以+1和-1(8位二进制)为例:
| 原码 | 反码 | 补码 | 移码 |
正数 | 0000 0001 | 原码 | 原码 | 1000 0001 |
负数 | 1000 0001 | 1111 1110 | 1111 1111 | 0111 1111 |
可计算 | 否 | 可 | 可 | 可 |
特征 | 符号位(最高); 0正,1负 | 正不变, 负非符号位取反 | 正不变, 反码并补1 | 补码符号位取反 |