您的位置:首页 > 理论基础

整数与浮点数的表示

2017-09-14 16:04 141 查看

有符号整数

首先约定数的真值:一个n位的二进制数a=(±)xn−1xn−2...x0,如果不使用符号,则默认认为是正数。真值没有符号位。

三种编码方式

原码(符号与幅值,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位无符号整数的取值范围x∈[0,2n−1]

浮点数(IEEE754标准)

IEEE754标准的浮点数按照三部分构成S|E|M

在规格化表示时其真值为x=(−1)S(1+M)⋅2E−127

以32位浮点数(C语言中的
float
类型)为例:

第1位为符号位S,0代表正数,1代表负数;

第2~9位(共8位)为阶码(指数部分)。在IEEE754标准中,阶码按照移码的方式存储,E=e+127,其中e是真实的指数。阶码的存储范围是0<E<255(开区间,E=0,255有特殊含义)因此实际指数范围−126<e<127,决定了32位浮点数的取值范围2−127−1<±x<2127+1≈3.4×1038(其中尾数的特殊情况M=1.1111...≈2)

剩余23位为尾数M,决定了32位浮点数的有效数字(精度)为lg223≈6位。

浮点数不能简单使用
==
判等。

指数尾数意义
000
0非0正负规格化数
1~254-正负浮点数
2550正负无穷
255非0Not a Number
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息