整数与浮点数的表示
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位。
浮点数不能简单使用
==判等。
指数 | 尾数 | 意义 |
---|---|---|
0 | 0 | 0 |
0 | 非0 | 正负规格化数 |
1~254 | - | 正负浮点数 |
255 | 0 | 正负无穷 |
255 | 非0 | Not a Number |
相关文章推荐
- 整数浮点数的二进制表示
- Python 小技巧:Python3 表示最大整数值和浮点数值
- 整数与浮点数的二进制表示方式 分类: C/C++ 2015-06-13 15:45 54人阅读 评论(0) 收藏
- 整数与浮点数的二进制表示方式
- 将整数的二进制表示转浮点数的二进制表示
- 浮点数能够精确表示的整数的范围
- C/C++中整数与浮点数在内存中的表示方式
- C/C++中整数与浮点数在内存中的表示方式
- (转载)浮点数的二进制表示
- 字符型数组表示大整数 并排序、求和(华科保研机试)
- Erlang 整数与浮点数转换
- 机器数的原码、反码、补码、移码表示以及浮点数的二进制表示
- 浮点数表示
- 根据 IEEE 754 浮点“双精度格式”位布局,返回指定浮点值的表示形式
- swift--浮点数转换成整数(四舍五入/直接截断)
- as3 中 定点表示法 和 浮点表示法
- 2.3题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
- Hive中避免科学计数法表示浮点数和长整数
- 计算机浮点数 float 表示
- 浮点数在计算机中的表示