原码
用尾数表示真值的绝对值,符号位“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真值最大