二进制有符号数处理(原码、补码、反码)
1、定义
在计算机进行运算时,需要将负数编码至二进制形式,所用的编码方法称为有符号数的表示。
2、原码
二进制里面没办法直接表示用“+”表示正号,“-”表示负号。
故分配最高位作为符号位来表示这个符号:当最高位为0表示一个正数,为1表示一个负数。
我们给出8位原码的二进制中有符号值和无符号值:
二进制 | 有符号值 | 无符号值 |
---|---|---|
0000 0000 | +0 | 0 |
0000 0001 | 1 | 1 |
… | … | … |
0111 1111 | 127 | 127 |
1000 0000 | -0 | 128 |
1000 0001 | -1 | 129 |
… | … | … |
1111 1111 | -127 | 255 |
这种表示法导致的结果就是可以有两种方式表示零,00000000(0)与10000000(−0),这大大增加数字电路的复杂性和设计难度。CPU亦须执行两次比较,来测试运算结果是否为零。
3、反码
另一方面,一种叫做反码的系统也可以用于表示负数,正数与原码形式一样,无需取反。
一个负数的二进制数反码形式为其绝对值部分按位取反,即符号位不变,其余各位按位取反。
我们给出8位反码的二进制中有符号值和无符号值:
二进制 | 有符号值 | 无符号值 |
---|---|---|
0000 0000 | +0 | 0 |
0000 0001 | 1 | 1 |
… | … | … |
0111 1101 | 125 | 125 |
0111 1110 | 126 | 126 |
0111 1111 | 127 | 127 |
1000 0000 | -127 | 128 |
1000 0001 | -126 | 129 |
1000 0001 | -1 | 130 |
… | … | … |
1111 1110 | -1 | 254 |
1111 1111 | -0 | 255 |
同原码表示一样,0的反码表示形式也有两种:00000000(+0)与11111111(−0),增加了数字电路的复杂性和设计难度。
4、补码
补码回避了0有多种表示的问题以及循环进位的需要。
在补码表示中,负数以位模式表示为正值的反码加1(当作无符号数),正数与原码形式一样。
我们给出8位反码的二进制中有符号值和无符号值:
二进制 | 有符号值 | 无符号值 |
---|---|---|
0000 0000 | 0 | 0 |
0000 0001 | 1 | 1 |
… | … | … |
0111 1110 | 126 | 126 |
0111 1111 | 127 | 127 |
1000 0000 | -128 | 128 |
1000 0001 | -127 | 129 |
1000 0010 | -126 | 130 |
… | … | … |
1111 1110 | -2 | 254 |
1111 1111 | -1 | 255 |
总结:
- 二进制正数,三码合一,即原码、反码、补码都一样;
- 二进制负数,反码是原码除最高位符号位余下取反所得结果,补码是反码再加1的结果。
示例:4-13用二进制计算,写下计算过程和结果