原码、反码、补码、移码存在于有符号数中,有符号数的最高位是符号位,0 表示正数,1 表示负数,这些码统称为机器数。
在计算机中,一个二进制数由符号位和数值位组成,在 8 位计算机中,由于最高位是符号位,数值位最多也就 7 位。
ps:下面介绍的各种码,如没有特殊说明,都是
8位
原码
原码是计算机用于表示的十进制数的方式。
在实际的生活中,表示正数是没有符号的,但是在计算机中,它不会脑补符号,所以为了方便讨论,我们把有符号的十进制数叫做真值,比如:+10、-10。
十进制数对应的原码:
- 定点整数:数值位高位补
0+10的原码:00001100-10的原码:10001100
- 定点小数:数值位低位补
0+0.75的原码:0.1100000-0.75的原码:1.1100000
十进制数中 +0 和 -0 都是相同的,但在计算机中要区分符号位,所以 0 的原码有两种表示方式:
+0:00000000-0:10000000
原码的表示范围:
- 定点整数:
-(2^(n-1) - 1)~2^(n-1) - 1-(2^7 - 1)~2^7 - 1-127~127
- 定点小数:
-(1 - 2^-(n-1))~1 - 2^-(n-1)-(1 - 2^-7)~1 - 2^-7-0.9921875~0.9921875
反码
反码是原码转补码的一个中间状态,实际没啥用
- 原码符号位是
0,反码等于原码 - 原码符号位是
1,数值位全部取反
十进制数对应的反码:
- 定点整数:
+10的原码:00001100,反码:00001100-10的原码:10001100,反码:11110011
- 定点小数:
+0.75的原码:0.1100000,反码:0.1100000-0.75的原码:1.1100000,反码:1.0011111
反码的表示范围和原码一样:
- 定点整数:
-(2^(n-1) - 1)~2^(n-1) - 1-(2^7 - 1)~2^7 - 1-127~127
- 定点小数:
-(1 - 2^-(n-1))~1 - 2^-(n-1)-(1 - 2^-7)~1 - 2^-7-0.9921875~0.9921875
0 的反码也有两种表示方式
+0的原码:00000000,反码:00000000-0的原码:10000000,反码:11111111
补码
补码的作用是将二进制数减法运算转变成加法运算
- 原码符号位是
0,补码等于原码 - 原码符号位是
1,补码 = 原码的反码,末尾 + 1(要考虑进位)
十进制数对应的补码:
- 定点整数:
+10的原码:00001100,反码:00001100,补码:00001100-10的原码:10001100,反码:11110011,补码:11110100
- 定点小数:
+0.75的原码:0.1100000,反码:0.1100000,补码:0.1100000-0.75的原码:1.1100000,反码:1.0011111,补码:1.0100000
0 的补码只有一种形式:00000000。为什么原码和反码都有两种表示方式,但补码就一种了呢?
+0的原码 = 反码 = 补码 =00000000-0的原码 =10000000,反码 =11111111,补码 =100000000,-0的补码有9位,而实际计算机才8位,最高位的1就会被舍弃,从而它的补码也是00000000
补码表示的范围:
- 定点整数:
-(2^(n-1))~2^(n-1) - 1,比原码多表示位:2^(n-1)-(2^7)~2^7 - 1-128~127
- 定点小数:
-1~1 - 2^-(n-1)-1~1 - 2^-7-1~0.9921875
负数补码转为原码,数值位取反,末尾 + 1
-10的补码为11110100,- 取反:
10001011,末尾 +1得到原码:10001100
- 取反:
-0.75的补码为1.0100000- 取反:
1.1011111,末尾 +1得到原码:1.1100000
- 取反:
[x]补 -> [-x]补,连同符号位取反,末尾 + 1
-10的补码为11110100->10的补码是?-10的补码取反00001011,末尾 +1得00001100
0.75的补码为0.1100000,->-0.75的补码是?0.75的补码取反1.0011111,末尾 +1的1.0100000
移码
移码的作用是判断两个数的大小
- 补码转移码:在补码的基础上将符号位取反
- 移码转补码:在移码的基础上将符号位取反
为什么补码和移码之间的转换,只需要符号位取反就行了?
- 移码 = 补码 - 偏置值(2^(n-1))
-10的补码为11110100,偏置值为128对应的二进制数为1000000011110100 - 10000000 = 01110100-10的移码为01110100
移码只能用于表示整数
十进制数对应的移码:
- 定点整数:
+10的补码:00001100,移码:10001100-10的补码:11110100,移码:01110100
- 定点小数:
+0.75的补码:0.1100000,移码:1.1100000-0.75的补码:1.0100000,移码:0.0100000
由于 0 的补码只有 00000000,所以它的移码也只有一个:10000000
移码只能表示顶点整数,所以它表示的范围和定点整数的补码表示范围是一致的
-(2^(n-1))~2^(n-1) - 1,比原码多表示位:2^(n-1)-(2^7)~2^7 - 1-128~127