原码、反码、补码、移码存在于有符号数中,有符号数的最高位是符号位,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
对应的二进制数为10000000
11110100 - 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