float型数据在内存中的存储方式

float型数据的取值范围在-3.4*10^38到+3.4*10^38次之间,其取值范围跟其在内存当中的存储方式(以科学计数法存储)有关:

float型数据在内存当中占4个字节,分布如下:

1bit(符号位)        8bit(指数位)      23bit(尾数位)

其中,符号位决定数值的正负,0表示正数,1表示负数;

指数位由8位二进制数表示无符号整数0~255(由于有符号数通常的表示法——补码——会使数值的比较变得困难,所以实际指数在存储前需要做偏差修正——即实际指数加上指数偏差127,将它的值调整到一个无符号数的范围内进行比较);

尾数位占23bit,表示规格化的二进制实数的小数点以后的部分(即科学计数法中的有效数字)。


IEEE 754规定,当指数在0


如十进制数19.375,此为正数,所以符号位为0,整数部分转化为二进制数为10011(1*2^4+1*2^1+1*2^0),小数部分转化为二进制数为0.011(1*2^-2+1*2^-3),所以19.375(十进制)=10011.011(二进制),采用科学计数法,将其小数点左移4位,则19.375(十进制)=10011.011(二进制)=1.0011011*2^4(二进制),最高有效位为1,指数为10000011(实际指数为4,加上指数偏差值127得到表示法指数10000011),规格化位数为0011011。

于是19.375在内存当中的实际表示方式为:

0        10000011        00110110000000000000000


又如十进制数-0.0625,此为负数,所以符号位为1,整数部分为0,小数部分转化为二进制数为0.0101(1*2^-2+1*2^-4),所以0.0625(十进制)=0.0101(二进制),采用科学计数法,将其小数点右移2位,则0.0625(十进制)=0.0101(二进制)=1.01*2^-2(二进制),最高有效位为1,指数为01111101(实际指数为-2,加上指数偏差值127得到表示法指数01111101),规格化位数为01。

于是19.375在内存当中的实际表示方式为:

1        01111101        01000000000000000000000

IEEE 754同时规定,当指数为0时,那么有效数最高有效位为0,这种形式也被称为非正规形式。

这里有三个特殊值需要指出:

当指数为0并且尾数为0,那么这个数为±0(跟符号位有关);

如果指数是255并且小数部分是0, 这个数是 ±无穷大同样和符号位相关);

如果 指数是255并且小数部分非0, 这个数表示为不是一个数(NaN)


根据以上叙述,表示法指数减去指数偏差127后,float实际指数的取值范围为-126~+127(其中-127和128作为特殊规定),于是float的取值范围为(尾数位最小值)-2*2^127到(尾数位最大值)+2*2^127,即-2^128到+2^128,表示为十进制为-3.4*10^38到+3.4*10^38;

而关于float所能表示的最小正数,即当指数位为0(实际指数为-127)时,其有效数最高有效位为0,此时尾数位能取得最小正值2^-23,规定此时表示的值为2^(-23)*2^(-126)=2^(-149)(此处指数取2^-126而不是2^-127,如果取2^-127的话,则位于2^-127~2^-126之间的数无法表示)。


你可能感兴趣的:(c程序设计语言)