C语言浮点数的存储方式

对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。

无论是单精度还是双精度在存储中都分为三个部分:

1、符号位(Sign) : 0代表正,1代表为负。//简写为S

2、指数位(Exponent):占用8-bit的二进制数,可表示数值范围为0255。但是指数应可正可负,所以IEEE规定,存储的时候E需要加上127(float类型)或加上1023(double类型),应用时此处算出的次方须减去127才是真正的指数(实际的指数,如12.5转换为二进制为:1100.100=1.100100*2^3, 3即为实际指数)。所以float的指数可从 -126128.//简写为E

3、底数部分(Mantissa):底数部分实际是占用24-bit的一个值,由于其最高位始终为1,所以最高位省去不存储,在存储中只有23-bit到目前为止,底数部分23位加上指数部分8 使用31位。那么前面说过,float是占用4个字节即32-bit, 那么还有一位是干嘛用的呢?  还有一位,其实就是4字节中的最高位,用来指示浮点数的正负,当最高位是1时,为负数,最高位是0时,为正数//简写为M,而double中E占11位,M站52位,符号位站1位;

用图来表示就是这样

如果是双精度(double)

C语言浮点数的存储方式_第1张图片

如果是单精度 (float)

C语言浮点数的存储方式_第2张图片

还有一种特殊情况,如果E的八位全是0,就表示这个值为0;如果E八位全是1,就表示无穷大

 

你可能感兴趣的:(c语言)