C语言中的float和double数据在内存中是如何存储的?

float类型在内存中占用4个字节,遵循IEEE-754格式标准,一个float由三部分组成:底数m、指数e和符号s。
float在内存中的存储形式如下:
在这里插入图片描述
float在内存中的具体格式如下:
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S:占用1位二进制数,表示浮点数的正负,0代表正数,1代表负数。
E:占用8位二进制数,并且指数位是按补码的形式来划分的,float的指数范围为-127 ~ +128,由于指数可正可负,因此,IEEE标准规定,计算出来的指数必须加上127后才可以存储,在实际运算时,直接减去127就是真正的指数了。
M:占用23位二进制数,使用二进制数来表示此浮点数的实际值,因为小数点前必为1,因此,IEEE标准规定,只记录小数点后的就好。

【举例】17.625在内存中的存储格式?

第一步:将17.625换算为二进制:10001.101
	换算规则1:整数部分,除以2,直到商为0,余数反转。
	换算规则2:小数部分,乘以2,直到乘位0,进位顺取。

第二步:将10001.101右移,直到小数点前只剩1位
	移位后:1.0001101 * 2^4

第三步:底数m、指数e和符号s
	底数m:因为小数点前必为1,因为,IEEE规定只记录小数点后的就好,底数为:0001101
	指数e:实际为4,必须加上127(转出的时候,减去127),所以为131,指数为:10000011
	符号s:符号部分是正数,符号为:0

第四步:综上所述,17.625在内存中的存储格式为
	01000001100011010000000000000000	

double类型在内存中占用8个字节,遵循IEEE-754格式标准,一个double由三部分组成:底数m、指数e和符号s。
double在内存中的存储形式如下:
在这里插入图片描述
double在内存中的具体格式如下:
SEEE EEEE EEEE MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM
S:占用1位二进制数,表示浮点数的正负,0代表正数,1代表负数。
E:占用11位二进制数,并且指数位是按补码的形式来划分的,double的指数范围为-1023 ~ +1024,由于指数可正可负,因此,IEEE标准规定,计算出来的指数必须加上1023后才可以存储,在实际运算时,直接减去1023就是真正的指数了。
M:占用52位二进制数,使用二进制数来表示此浮点数的实际值,因为小数点前必为1,因此,IEEE标准规定,只记录小数点后的就好。

【举例】17.625在内存中的存储格式?

第一步:将17.625换算为二进制:10001.101
	换算规则1:整数部分,除以2,直到商为0,余数反转。
	换算规则2:小数部分,乘以2,直到乘位0,进位顺取。

第二步:将10001.101右移,直到小数点前只剩1位
	移位后:1.0001101 * 2^4

第三步:底数m、指数e和符号s
	底数m:因为小数点前必为1,因为,IEEE规定只记录小数点后的就好,底数为:0001101
	指数e:实际为4,必须加上1023(转出的时候,减去1023),所以为1027,指数为:‭10000000011‬
	符号s:符号部分是正数,符号为:0

第四步:综上所述,17.625在内存中的存储格式为
	0100000000110001101000000000000000000000000000000000000000000000

猜你喜欢

转载自blog.csdn.net/qq_38490457/article/details/105783588