数据在内存中的存储

整数在内存中的存储:        

        整数的二进制表示方式有三种:原码反码补码,这三种表示方式都有符号位(最高位,0为正,1为负)和数值位(除去最高位后的其他位)

        对于整数来说,数值的存储方式时补码(可以将符号位和数值位统一处理),超过一个字节的数据在存储时存在存储顺序的问题,存储方式分为大端字节序存储和小端字节序存储.

        大端字节序存储;数据的低位字节内容保存在内存的高地址处,高位字节内容保存在低地址处.

        小端字节序存储同理.

我们可以通过代码判断当前机器为大端存储还是小端存储:

int  main()
{
    int a = 1;
    char* p = (char*)&a;

    if(*p == 1)
    {
        printf("小端");
    }
    else
    {
        printf("大端");
    }
return 0;
}

浮点数在内存中的存储:浮点数的存储方式与整形不同,任何一个二进制浮点数v都可以表示为(-1)的s次方*M*2的E次方

-1的s次方为符号位,

M是有效数字(1<=M<2),

2的E次方表示指数位

因此对于32位浮点数(float),最高位存储s,接着8位存储E,剩下23位存储M

对于64位浮点数(double),最高位存储s,接着11位存储E,剩下52位存储M

考虑到E的真实值可能位负,但规定的E为无符号整形,因此存储E是需要加入一个中间值

对于8位的E为127, 对于11位的E位1023

        浮点数取出的过程:

1.E不全为0或不全为1时:

指数E的值等于1-127(或1-1023),得到真实值再将有效数字M前加上第一位的1

2.E全为0时:

此时E为-127(或-1023),有效数字M前不再加1,而是还原为0.xxxx小数,这样做是为了表示±0或无限接近于0的小数

3.E全为1时:

此时有效数字M全为0,表示±无穷大(符号取决与s位)

受限于位数,部分浮点数在内存中可能无法精确保存,而double类的精度高于float类

因此,浮点数比较大小时,直接用==号可能存在问题,因此可以使用if语句限定误差在可接受范围内.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值