有符号整数
首先约定数的真值:一个n位的二进制数
三种编码方式
- 原码(符号与幅值,sign and magnitude)
一个n位的二进制原码表示的数,第1位是符号位,后面n−1 位是数的绝对值。原码的缺点在于有两个0:符号位分别为1 和0,其他位均为0 时。 - 反码(one’s complement)
反码是作为原码和补码之间的一种过渡。在反码表示法中,一个数的相反数就是将其每一位取反。因此第一位也是符号位。正数的反码与其原码相同,负数的反码的符号位为1(负号),其余的位将真值的每一位取反。 - 补码
补码是硬件使用的编码。对于正数,补码与其原码相同;负数的补码,是其反码的最低位再加上一。
虽然n 位有符号整数的补码真值使用公式x补=−2n−1xn−1+∑n−2i=02ixi计算,但是同样满足最高位xn−1确定符号。
对于使用补码的有符号整数,其取值范围是x∈[−2n−1,2n−1−1]
符号扩展(sign extension)
- 对于一个有限位数的有符号整数的补码表示,以复制符号位的方式将其扩展到更高的位数,叫做符号扩展。比如将210的16位补码表示
0000,0000,0000,0010
进行符号扩展:(符号位为0进行复制)
0000,0000,0000,0000,0000,0000,0000,0010
又比如将−210的16位补码表示
1111,1111,1111,1110
进行符号扩展:(符号位为1进行复制)
1111,1111,1111,1111,1111,1111,1111,1110
注意
- 注意区分由原码、反码计算补码(p.21)和由补码计算其相反数的补码(p.28)
由原码计算补码,要区分正负号;正数的补码和原码相同;负数的补码,先将原码的非符号位全部按位取反得到反码,然后再加1得到补码;
对一个数的补码计算其相反数的补码,只需要对其所有位按位取反,然后再加上1就可以了。
无符号整数
无符号整数不包含符号位,所有的位数直接按照二进制表示存储真值。
n位无符号整数的取值范围
浮点数(IEEE754标准)
IEEE754标准的浮点数按照三部分构成S|E|M
在规格化表示时其真值为x=(−1)S(1+M)⋅2E−127
以32位浮点数(C语言中的float
类型)为例:
第1位为符号位S,0代表正数,1代表负数;
第2~9位(共8位)为阶码(指数部分)。在IEEE754标准中,阶码按照移码的方式存储,
剩余23位为尾数M,决定了32位浮点数的有效数字(精度)为
浮点数不能简单使用
==
判等。
指数 | 尾数 | 意义 |
---|---|---|
0 | 0 | 0 |
0 | 非0 | 正负规格化数 |
1~254 | - | 正负浮点数 |
255 | 0 | 正负无穷 |
255 | 非0 | Not a Number |