任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。
在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。对于float型数据,其二进制有32位,其中符号位1位,阶码8位,尾数23位;对于double型数据,其二进制为64位,符号位1位,阶码11位,尾数52位。
单精度、双精度IEEE754浮点数格式:
31 30-23 22-0
float 符号位 阶码 尾数
63 62-52 51-0
double 符号位 阶码 尾数
符号位:0表示正,1表示负
阶码:这里阶码采用移码表示,对于float型数据
参数
参数 | 单精度float | 双精度浮点数 |
浮点数长度 | 32 | 64 |
尾数长度P | 23 | 52 |
符号位S | 1 | 1 |
指数长度E即阶码 | 8 | 11 |
最大指数 | 127 | 1023 |
最小指数 | -126 | -1022 |
指数偏移量 | 127 | 1023 |
可表示的范围 | 10^-38~10^38 | 10^-308~10^308 |
例子:将十进制数178.125转换成单精度浮点数:
1.首先将178.25转换成二进制形式(10110010.001)
2.再将二进制转换为规格化的形式:1.0110010001*2^7,从该式可以看出,符号位S为0,尾数01100100010000000000000
阶码为E=7+127=134 转换为二进制:10000110
所有单精度的表示形式为:
0 | 10000110 | 01100100010000000000000 |
根据单精度浮点数转换成十进制:
0 | 01111110 | 10110000000000000000000 |
指数=E-127=01111110-127=-1,尾数=1.1011
1.1011*2^-1=0.11011(二进制)=0.84375(十进制)
机器字长为n,带符号定点数的表示范围
码制 | 定点整数 | 定点小数 |
原码 | -(2^(n-1)-1)~2^(n-1)-1 | -(1-2^-(n-1))~1-2^-(n-1) |
反码 | -(2^(n-1)-1)~2^(n-1)-1 | -(1-2^-(n-1))~1-2^-(n-1) |
补码 | -2^(n-1)~2^(n-1)-1 | -1~+(1-2^-(n-1)) |
移码 | -2^(n-1)~2^(n-1)-1 | -1~+(1-2^-(n-1)) |