机组–原码、补码、反码、移码
首先,对于正数而言,原码=反码=补码
在开始下面内容前,做以下约定: X X X表示真值, [ X ] 原 [X]_原 [X]原表示原码, [ X ] 反 [X]_反 [X]反表示反码, [ X ] 补 [X]_补 [X]补表示补码。并且您可能需要一定的将十进制数转化为二进制数的基础。
有符号数与无符号数
-
无符号数:整个机器字长的全部二进制均为数值位
如 :
X = + 27 X=+27 X=+27
无符号数为: 11011 11011 11011
-
有符号数:在"无符号数"的最高位添加符号位:
+
:0,-
:1如 :
X = + 27 X=+27 X=+27
有符号数为: 011011 011011 011011
X = − 27 X=-27 X=−27
有符号数为: 111011 111011 111011
原码
机器数最高位表示符号,其余位表示该数的绝对值
如果规定了机器字长,而我们的原码位数又不够时,需要我们进行补零,之后再修改符号位。
具体的:
-
当为整数时:在有效数值最高位前面补零,不影响整体取值。之后将最高位修改为符号位
假定机器字长为8位
X = + 27 X=+27 X=+27 , [ X ] 原 [X]_原 [X]原: 00011011 00011011 00011011
X = − 27 X=-27 X=−27 , [ X ] 原 [X]_原 [X]原: 10011011 10011011 10011011
-
当为小数时:在有效数值最低位后面补零,不影响整体取值。之后再将最高位修改为符号位
假定机器字长为8位(定点小数表现形式可见下方"定点小数")
X = + 0.625 X=+0.625 X=+0.625, [ X ] 原 [X]_原 [X]原: [ 0.1010000 ] [0.1010000] [0.1010000]
X = − 0.625 X=-0.625 X=−0.625, [ X ] 原 [X]_原 [X]原: [ 1.1010000 ] [1.1010000] [1.1010000]
值得注意的是,真值0有两种不同形式表达: [ + 0 ] 原 = [ 0000 ] 、 [ − 0 ] 原 = [ 1000 ] [+0]_原=[0000]、[-0]_原=[1000] [+0]原=[0000]、[−0]原=[1000]
机器数的定点表示
-
定点小数:纯小数,小数点
.
位置在符号位之后、有效数值部分最高位之前。符号位:+
:0、-
:1,位于最前。这里的纯小数指的是,整数部分为零。 0.0101 0.0101 0.0101 √、 1.0101 1.0101 1.0101 ×、
如: [ + 0.625 ] 原 = [ 0.101 ] [+0.625]_原 = [0.101] [+0.625]原=[0.101]、 [ − 0.125 ] 原 = [ 1.001 ] [-0.125]_原 = [1.001] [−0.125]原=[1.001]
-
定点整数:纯整数,小数点
.
位置在有效数值位最低位之后。且在最前面用逗号,
将整数部分与符号位隔开如: [ + 27 ] 原 [+27]_原 [+27]原 = 0 , 11011 0,11011 0,11011、 [ − 27 ] 原 [-27]_原 [−27]原 = 1 , 11011 1,11011 1,11011
反码
对于正数,其反码与原码形式一致。
[ + 27 ] 原 = 00011011 [+27]_原=00011011 [+27]原=00011011 => [ + 27 ] 反 [+27]_反 [+27]反 = 00011011 00011011 00011011
[ + 0.625 ] 原 = [ 0.1010000 ] [+0.625]_原=[0.1010000] [+0.625]原=[0.1010000] => [ + 0.625 ] 反 = [ 0.1010000 ] [+0.625]_反=[0.1010000] [+0.625]反=[0.1010000]
对于负数,将原码的符号位保持不变,其余部分按位取反。
假定机器字长8位
[ − 27 ] 原 [-27]_原 [−27]原 = 10011011 10011011 10011011 => [ − 27 ] 反 [-27]_反 [−27]反 = 11100100 11100100 11100100
[ − 0.625 ] 原 = [ 1.1010000 ] [-0.625]_原=[1.1010000] [−0.625]原=[1.1010000] => [ + 0.625 ] 反 = [ 1.0101111 ] [+0.625]_反=[1.0101111] [+0.625]反=[1.0101111]
值得注意的是,真值0有两种不同形式表达: [ + 0 ] 反 = [ 0000 ] 、 [ − 0 ] 反 = [ 1111 ] [+0]_反=[0000]、[-0]_反=[1111] [+0]反=[0000]、[−0]反=[1111]
补码
原码转补码:
对于正数,其补码与原码形式一致。
对于负数,在反码的基础上+1。
值得注意的是,真值0的补码表现形式唯一。
[ − 27 ] 原 [-27]_原 [−27]原 = 10011011 10011011 10011011 => $ [-27]_补$= [ − 27 ] 反 + 1 [-27]_反+1 [−27]反+1 = 11100100 11100100 11100100 +1 = 11100101 11100101 11100101
[ − 0.625 ] 原 = [ 1.1010000 ] [-0.625]_原=[1.1010000] [−0.625]原=[1.1010000] => [ − 0.625 ] 补 [-0.625]_补 [−0.625]补 = [ − 0.625 ] 反 + 1 = 1.0101111 + 1 [-0.625]_反+1=1.0101111+1 [−0.625]反+1=1.0101111+1 = 1.0110000 1.0110000 1.0110000
另法一:
假设负纯整数X,将其转化为原码共有二进制位数 N + 1 N+1 N+1,则X补码为: [ 2 N + 1 − ∣ X ∣ ] [2^{N+1}-|X|] [2N+1−∣X∣]
如:X = -13 = [ − 1101 ] [-1101] [−1101] => [ − 1101 ] 原 = [ 11101 ] [-1101]_原=[11101] [−1101]原=[11101] ,其中二进制位数为 5 5 5 => 2 5 = 32 2^5=32 25=32,
因此其 补码为: [ X ] 补 = 32 − ∣ − 13 ∣ = 19 = [ 10011 ] [X]_补=32-|-13| = 19 = [10011] [X]补=32−∣−13∣=19=[10011]
另法二:
对负定点小数的原码X,从右往左扫描,尾数的第一个1及其右部的0保持不变,左部的各位取反,符号位保持不变。
如 [ X ] 原 = [ 1.1110011000 ] [X]_原=[1.1110011000] [X]原=[1.1110011000] =>1.0001101000
补码转原码:
规则:对于负数,补码的除符号位取反后+1
[ − 13 ] 补 = [ 10011 ] [-13]_补=[10011] [−13]补=[10011] =>取反=> [ 11100 ] [11100] [11100] =>+1=> [ − 13 ] 原 = [ 11101 ] [-13]_原=[11101] [−13]原=[11101]
移码
一个真值的移码和补码仅差一个符号位,将补码符号位取反即可得到移码。
附录
一些码的可表示范围:
n n n 位码 | 最小值 | 最大值 |
---|---|---|
无符号小数 | 0 | 1 − 2 − n 1-2^{-n} 1−2−n |
无符号整数 | 0 | 2 n − 1 2^n-1 2n−1 |
定点小数 | − ( 1 − 2 − n ) -(1-2^{-n}) −(1−2−n) | 1 − 2 − n 1-2^{-n} 1−2−n |
定点整数 | − ( 2 n − 1 ) -(2^{n}-1) −(2n−1) | 2 n − 1 2^{n}-1 2n−1 |
原码纯小数 | − ( 1 − 2 − ( n − 1 ) ) -(1-2^{-(n-1)}) −(1−2−(n−1)) | 1 − 2 − ( n − 1 ) 1-2^{-(n-1)} 1−2−(n−1) |
原码纯整数 | − ( 2 ( n − 1 ) − 1 ) -(2^{(n-1)}-1) −(2(n−1)−1) | 2 ( n − 1 ) − 1 2^{(n-1)}-1 2(n−1)−1 |
反码纯小数 | − ( 1 − 2 − ( n − 1 ) ) -(1-2^{-(n-1)}) −(1−2−(n−1)) | 1 − 2 − ( n − 1 ) 1-2^{-(n-1)} 1−2−(n−1) |
反码纯整数 | − ( 2 ( n − 1 ) − 1 ) -(2^{(n-1)}-1) −(2(n−1)−1) | 1 − 2 − ( n − 1 ) 1-2^{-(n-1)} 1−2−(n−1) |
补码纯小数 | − 1 -1 −1 (比原码多表示 − 1 -1 −1) | 1 − 2 − ( n − 1 ) 1-2^{-(n-1)} 1−2−(n−1) |
补码纯整数 | − 2 n -2^n −2n (比原码多表示 − 2 n -2^n −2n) | 2 ( n − 1 ) − 1 2^{(n-1)}-1 2(n−1)−1 |