原码:原码是计算机中对数字的二进制表示方法,原码的最高位是符号位,0表示正数,1表示负数。
反码:反码是数值存储的一种,多应用于系统环境设置,如linux平台的目录和文件的默认权限的设置umask,就是使用反码原理。反码的计算是原码的符号位不动,其余的取反。
补码:在计算机系统中,数值一律用补码来表示和存储。补码的计算区分正负数,正数的补码和原码相同,负数的补码是符号位不变,反码加1。
例子:
- -6:
- 原码:10000110
- 反码:11111001
- 补码:11111010
- -1:
- 原码:10000001
- 反码:11111110
- 补码:11111111
计算机系统为什么使用补码?
先看例子:
- 0:用正数表示
- 原码:00000000
- 反码:01111111
- 补码:00000000
- 0:用负数表示
- 原码:10000000
- 反码:11111111
- 补码:00000000
所以0不管使用正数还是负数表示,它的补码都是一样的。
例子:
-6+5:
11111010
+ 00000101
= 11111111
-4+5:
11111100
+ 00000101
= 00000001
-3+5:
11111101
+ 00000101
= 00000010
可以发现补码做数值相加是非常方便的,-3+5等同于5-3,所以减法也是如此。运算过程是相同的,不需要额外的硬件电路。需要注意的是计算机数值相加,符号位是需要参与运算的。