原码
用尾数表示真值的绝对值,符号位“0/1”对应“正/负”
若机器字长n+1位,原码整数的表示范围:
−
(
2
n
−
1
)
≤
x
≤
2
n
−
1
{\color{Red} -(2^{n}-1)\leq x\leq 2^{n}-1}
−(2n−1)≤x≤2n−1(关于原点对称)
真值0有
+
0
{\color{Red} +0}
+0 和
−
0
{\color{Red} -0}
−0 两种形式
若机器字长 n+1 位,原码小数的表示范围:
−
(
1
−
2
−
n
)
≤
x
≤
1
−
2
−
n
{\color{Red} -(1-2^{-n})\leq x\leq 1-2^{-n}}
−(1−2−n)≤x≤1−2−n(关于原点对称)
真值0有 + 0 {\color{Red} +0} +0 和 − 0 {\color{Red} -0} −0 两种形式
反码
若符号位为0,则反码与原码相同
若符号位为1,则数值位全部取反
若机器字长 n+1 位,反码整数的表示范围:
−
(
2
n
−
1
)
≤
x
≤
2
n
−
1
{\color{Red} -(2^{n}-1)\leq x\leq 2^{n}-1}
−(2n−1)≤x≤2n−1(关于原点对称)
若机器字长 n+1 位,反码小数的表示范围:
−
(
1
−
2
−
n
)
≤
x
≤
1
−
2
−
n
{\color{Red} -(1-2^{-n})\leq x\leq 1-2^{-n}}
−(1−2−n)≤x≤1−2−n(关于原点对称)
真值0有
+
0
{\color{Red} +0}
+0 和
−
0
{\color{Red} -0}
−0 两种形式
[
+
0
]
原
=
0
,
0000000
[+0]_{原}=0,0000000
[+0]原=0,0000000
[
−
0
]
原
=
1
,
0000000
[-0]_{原}=1,0000000
[−0]原=1,0000000
[
+
0
]
反
=
0
,
0000000
[+0]_{反}=0,0000000
[+0]反=0,0000000
[
−
0
]
反
=
1
,
1111111
[-0]_{反}=1,1111111
[−0]反=1,1111111
补码
正数的补码=原码
负数的补码=反码末尾+1(要考虑进位)
若机器字长 n+1 位,补码整数的表示范围:
−
2
n
≤
x
≤
2
n
−
1
{\color{Red} -2^{n}\leq x\leq 2^n-1}
−2n≤x≤2n−1(比原码多表示一个负数
−
2
n
{\color{Red}-2^{n}}
−2n)
若机器字长 n+1 位,补码小数的表示范围:
−
1
≤
x
≤
1
−
2
−
n
{\color{Red} -1\leq x\leq 1-2^{-n}}
−1≤x≤1−2−n(比原码多表示一个
−
1
{\color{Red}-1}
−1)
补码的作用:让减法操作转变为等价的加法操作,节省硬件成本,ALU中无需集成减法器,执行加减法时,符号位一起参与运算
注意:补码的真值0只有一种表示形式
定点整数补码 [ x ] 补 = 1 , 0000000 [x]_{补}=1,0000000 [x]补=1,0000000 表示 x = − 2 7 {\color{Red} x=-2^{7}} x=−27
整数的原码和补码之间的相互转换都是数值位取反,末尾加1
定点小数补码 [ x ] 补 = 1 , 0000000 [x]_{补}=1,0000000 [x]补=1,0000000 表示 x = − 1 {\color{Red} x=-1} x=−1
小数的原码和补码之间的相互转换都是尾数取反,末尾加1
移码
在补码的基础上将符号位取反。注意:移码只能用于表示整数
移码的计算:移码=真值+偏置值
比如8位移码的偏置值=1000 0000B,即就是 2 n − 1 2^{n-1} 2n−1
——————
-127
原码=1111 1111B
真值=-111 1111
移码=-111 1111B+1000 0000=0000 0001
——————
+127
原码=0111 1111B
真值=0111 1111
移码=0111 1111+1000 0000=1111 1111
移码的真值0只有一种表示形式:
[
+
0
]
移
=
[
−
0
]
移
=
1
,
0000000
[+0]_{移}=[-0]_{移}=1,0000000
[+0]移=[−0]移=1,0000000
若机器字长 n+1 位,移码整数的表示范围:
−
2
n
≤
x
≤
2
n
−
1
{\color{Red} -2^{n}\leq x\leq 2^n-1}
−2n≤x≤2n−1(与补码相同)
移码的作用:移码很方便的用计算机硬件判断两个整数的大小
之后的浮点数的相关运算中会大量使用到移码
练习
- 定点整数x=50,用8位原码、反码、补码、移码表示
32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | 1 | 0 |
前面补0,凑足8位,其中第一位为符号位
[
x
]
原
=
[
x
]
反
=
[
x
]
补
=
0
0110010
[x]_{原}=[x]_{反}=[x]_{补}={\color{Red} 0}0110010
[x]原=[x]反=[x]补=00110010
[
x
]
移
=
1
0110010
[x]_{移}={\color{Red} 1}0110010
[x]移=10110010 (补码的符号位由1变为0)
- 定点整数x=-100,用8位原码、反码、补码、移码表示
【解析】
[
x
]
原
=
1
1100100
[x]_{原}={\color{Red} 1}1100100
[x]原=11100100
[
x
]
反
=
1
0011011
[x]_{反}={\color{Red} 1}0011011
[x]反=10011011(原码数值位取反)
[
x
]
补
=
1
0011100
[x]_{补}={\color{Red} 1}0011100
[x]补=10011100(补码数值位加1)
[
x
]
移
=
0
0011100
[x]_{移}={\color{Red} 0}0011100
[x]移=00011100(补码的符号位由1变为0)
- 求下列各种码对应的真值
[ x ] 原 = 1 0001101 [x]_{原}={\color{Red} 1}0001101 [x]原=10001101 【-(1+4+8)=-13】
[ x ] 反 = 1 0001101 [x]_{反}={\color{Red} 1}0001101 [x]反=10001101 【 [ x ] 原 = 1 1110010 [x]_{原}={\color{Red} 1}1110010 [x]原=11110010,-(2+16+32+64)=-114】
[ x ] 补 = 1 0001101 [x]_{补}={\color{Red} 1}0001101 [x]补=10001101 【 [ x ] 原 = 1 1110011 [x]_{原}={\color{Red} 1}1110011 [x]原=11110011, -115】
[ x ] 移 = 1 0001101 [x]_{移}={\color{Red} 1}0001101 [x]移=10001101 【 [ x ] 补 = 0 00001101 [x]_{补}={\color{Red} 0}00001101 [x]补=000001101= [ x ] 原 [x]_{原} [x]原(正数的原码等于补码), +13】
【解析】
[ x ] 原 = 0 0001101 [x]_{原}={\color{Red} 0}0001101 [x]原=00001101 【+(1+4+8)=+13】
[ x ] 反 = 0 0001101 [x]_{反}={\color{Red} 0}0001101 [x]反=00001101 【+13】
[ x ] 补 = 0 0001101 [x]_{补}={\color{Red} 0}0001101 [x]补=00001101 【+13】
[ x ] 移 = 0 0001101 [x]_{移}={\color{Red} 0}0001101 [x]移=00001101 【 [ x ] 补 = 1 0001101 [x]_{补}={\color{Red} 1}0001101 [x]补=10001101, [ x ] 原 = 1 1110011 [x]_{原}={\color{Red} 1}1110011 [x]原=11110011, -(1+2+16+32+64)=-115】
补充:由 [ x ] 补 [x]_{补} [x]补快速求 [ − x ] 补 [-x]_{补} [−x]补的方法
符号位、数值位全部取反,末位+1
总结
原码和反码的真值0有两种表示;
补码和移码的真值0只有一种表示。
若机器字长为n+1位,则:
原码和反码:
整数表示范围:
−
(
2
n
−
1
)
≤
x
≤
2
n
−
1
{\color{Red} -(2^{n}-1)\leq x\leq 2^{n}-1}
−(2n−1)≤x≤2n−1
小数表示范围:
−
(
1
−
2
−
n
)
≤
x
≤
1
−
2
−
n
{\color{Red} -(1-2^{-n})\leq x\leq 1-2^{-n}}
−(1−2−n)≤x≤1−2−n
补码:
整数表示范围:
−
2
n
≤
x
≤
2
n
−
1
{\color{Red} -2^{n}\leq x\leq 2^n-1}
−2n≤x≤2n−1
小数表示范围:
−
1
≤
x
≤
1
−
2
−
n
{\color{Red} -1\leq x\leq 1-2^{-n}}
−1≤x≤1−2−n
移码:
整数表示范围:
−
2
n
≤
x
≤
2
n
−
1
{\color{Red} -2^{n}\leq x\leq 2^n-1}
−2n≤x≤2n−1
移码全0真值最小,移码全1真值最大