【C语言】整数和浮点数在内存中的存储

本文详细解释了数据在内存中的存储方式,包括32位系统中整数和浮点数(如int,char,float,double)的存储结构,以及IEEE754标准对浮点数的表示。讨论了浮点数存储精度问题,特别指出浮点数比较可能导致的意外结果。
摘要由CSDN通过智能技术生成

数据在内存中的存储 

         首先,要知道数据在是以二进制的方式存储,并且存储的是补码。

1.整数在内存中的存储

        在32位操作系统中,

        int(signed int)类型占四个字节,表示范围为-2147483648~2147483647。

        unsigned int类型占四个字节,表示范围为0~4294967295。

        

        char(signed char)类型占一个字节,表示范围为-128~127。

        unsigned char类型占一个字节,表示范围为0~255。

       

        注意:

                char类型本质上存储的是ASCII码值,所以也归类到整数里。

2.浮点数在内存中的存储

        根据国际标准IEEE(电气和电子工程协会) 754,任意⼀个二进制浮点数V可以表示成下面的形式:

        V   =  (−1)^S * M * 2^E

        (−1)^S:表示符号位,当S=0,V为正数;当S=1,V为负数。

        M:表示有效数字,M是大于等于1,小于2的。

        2^E:表示指数位。

        那么我们只需要存储S,M,E的值就可以还原出浮点数的值。

        在C语言中, S,M,E的值是这样存放的:

                       

从它们的存储差异就可以看出,double类型(双精度浮点数)的精确度要大于float类型(单精度浮点数) 。

2.1浮点数存储存在的问题

        由于浮点数存在存储精度,所以他对于有些小数可以精确存储,而对于有些小数确不能精确存储。

        例如:

#include <stdio.h>


int main()
{
	float a = 97.1f;
	printf("%f", a);

	return 0;
}

可以看到97.1并非精确的存储在a中,如果之后的再出现类似这样的语句

if(a == 97.1)
{
    ;
}

很有可能出现问题,所以应该尽量避免浮点数和小数直接比较,其结果可能是难以预期的。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值