C语言:浮点数(float)在内存中的存储

V=(-1)^{S} *M *2^{E}

浮点数在内存中以该形式进行存储;例如:-101.1=(-1)^{1} *1.011 *2^{2}【二进制】;

所以在内存中只用存储S、M、E三个变量;

存储M时:M的形式总是为为1.xxxxxx;所以节省空间存储时舍掉1,只存储小数部分,计算时再加上;

存储 E时:E为一个无符号整型,始终存储一个正整数 ;为了使E以正整数形式存入,对于8位的E,存储时加上中间数127;对于11位,加上中间数1023;

(以全0为例)

SEM

单精度浮点数存储(32位、4字节)

0 00000000 00000000000000000000000

1bit8bit23bit

双精度浮点数存储(64位、8字节)

0 00000000000  00000000000000000000000

00000000000000000000000000000

1bit11bit52bit

浮点数整个在内存中存储的过程: (以下为例)

int main()
{
	float f = 5.5;//32位,4个字节
	return 0;
}

    //5.5
    //101.1 (转换成二进制)
    //S=0;  E=2;       M=1.011
    //0     2+127           011
    //0   10000001     01100000000000000000000
    //0100 0000 1011 00000000000000000000
    // 0x 40 b0 00 00 (转换为十六进制)

 注:

当将存入内存中的浮点数取出时,分为三种情况:

(1)E不为全0也不为全1

          按照存储的方式反向计算得到原浮点数。

(2)E为全0

           V= -(1)^S*E^(-127)*1.xxxxxx,接近0。

(3)E为全1

           V= -(1)^S*E^(127)*1.xxxxxx,无穷大。

思考:当一个整型变量以浮点型打印,或者一个浮点型变量以整型打印,会发生什么?

int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	*pFloat = 9.0;
	printf("num的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	return 0;
}
/*输出结果:
n的值为:9
*pFloat的值为:0.000000
num的值为:1091567616
* pFloat的值为:9.000000
*/

此时,我们发现当打印类型与变量类型不符时,会输出一个毫不相关的数。事实上,整型变量是将其转换为二进制数存储在内存中,而浮点型是将公式 V=(-1)^{S} *M *2^{E}中的S、M、E以二进制的形式存储在内存中,如果将一个整型变量以浮点型打印,那么就会把整型存储的二进制补码翻译成浮点型公式打印,整型打印浮点型亦然,这种方法是不可取的,在此之前必须对变量进行强制类型转换。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值