整数和浮点数在内存中存储

大家好,今天我为大家介绍关于整数与浮点数在内存中的存储,我们通过今天的讲解一定会更加理解浮点数的储存模式,更好修炼大家的内功,来开启我们的学习之旅吧!

1.整数与浮点数在内存中存储是否一样

首先我们大家都有一个疑问,在内存中数据的存储不都是以二进制形式存储的吗?还有什么不同呢?其实我在学习本节课之前我和大家的认知是一样的,都是认为他们的存储都是一样的,但是今天我可以告诉给大家,在内存中存储其实并不一样,下面我为大家详细的介绍一下。

整数与浮点数在内存中存储的例子

下面我为大家举出一个关于他们在内存存储的例子,如下:


int main()
{
    int n = 9;//整型的存储方式,补码
    //00000000000000000000000000001001   9的补码
    //
    float* pFloat = (float*)&n;

    printf("n的值为:%d\n", n);//9
    printf("*pFloat的值为:%f\n", *pFloat);
    //0 00000000 00000000000000000001001
    //E 为全0
    //(-1)^0 * 0.00000000000000000001001 *  2^-126
    //1*
    //0.000000

    *pFloat = 9.0;
    //1001.0
    //(-1)^0 * 1.001*2^3
    //S=0
    //M=1.001
    //E = 3
    //01000001000100000000000000000000
    //
    printf("num的值为:%d\n", n);
    printf("*pFloat的值为:%f\n", *pFloat);//9.0
    return 0;
}

大家觉得这个会是多少呢?我想大家所想的可能会和标准运行结果会有差距,那么的话,下面我就为大家介绍一下,这个程序的运行结果:是9,0,1091567616,9.0
在这里插入图片描述
因此我们可以知道,浮点数在内存中的存储与整数是不一样的,存储原理是不同的,那么为何会造成这种不同呢?下面我就为大家介绍一下,他们存储的具体实现。

2.整数在内存中的存储

这个我们都知道,整数在内存中是按照二进制的补码进行存储的,而正数的补码就是正数其本身,但是负数的补码则是其原二进制的反码+1,具体的讲在二进制当中我已经为大家详细介绍过了,下面我们看一下他们的具体的例子就可以了。

整数在内存中存储的具体例子

下面我为大家介绍关于整数在内存中存储的一些例子,

int a=9;
int w=-9;

我们通过这个例子可以看出在内存中,a的存储是原来的二进制编码,但是呢w则是反码加1,通过以上我对于整数的诠释相信大家一定会明白整数在内存中存储原理,下面我就为大家介绍关于浮点数在内存中的存储原理。

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

1.规定相关东西

首先呢,

IEEE754规定了,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (−1) S *M * 2E
•(-1)S表⽰符号位,当S=0,V为正数;当S=1,V为负数 • M 表⽰有效数字,M是⼤于等于1,⼩于2的
• 2E 表⽰指数位

IEEE754的详细相关规定

1.这个组织对于浮点数的详细相关规定是一下几个方面:

1.对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
2.对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

大家看有图所示:
在这里插入图片描述
以及这个图案:
在这里插入图片描述
2.详细的相关定如下:
1.IEEE754规定M必须是大于等于1但是小于等于2,在书写中系统默认前面有一那么就相当于,在写M中前面的数字1可以不用自己书写只用书写1后面的部分就可以了,我给大家举出例子如下所示:
比如M=1.00001那么在内存中存储M的时候相当于将1后面的部分存储下来,也就是说存储的是00001
2,IEEE754规定对于指数部分就有些麻烦了,对于有8位的E来说,就是相当于给指数加上127,但是对于有11为的E来说,那么相等于是给指数加上1023.
3.我相信大家对于S一定是比较明白的那么的话,我就不为大家详细介绍了。

2.浮点数在内存中的具体示例

首先在给大家举出例子的时候,希望大家明白一下几点。
1.若果E全为0那么的话就是不用再给M加上1了而是用0.xxxx表示,而指数则是需要用1-127表示,因此这个数字是正负都很接近0的数字
2.若果E全为1的话那么就表示的数字是正负无穷大。

3.讲解上例当中的题目

大家通过我的相信分析,那么的话相信大家对于浮点数在内存中的存储一定有一番理解了,下面我就为大家介绍刚刚的题目。
1.首先呢题目中说n=9而9又是一个正数,根据前面讲到的,可以知道9的原码,反码,补码都是一样的,9的补码是00000000 00000000 00000000 001001
但是呢由于后面的语句意思是说将9.0的浮点数数地址强制转换为整数的地址,根据上面讲到的IEEE754标准可以知道的是在内存中其9.0的补码存储为浮点数地址,V=(-1)0 *1.001 *23
那么E等于3+127=130;M等于0001,S=0,也就是这样子的:0 100 0001 0001 0000 0000 0000 0000 0000
由于最高位是0那么原反补一样,是01000001000100000000000000000000,转换为十进制整数,就是1,091,567,616
2.由于整数9转化为浮点数,是0 00000000 0000000000000000000001001
由于E全为0那么这个数就非常接近0,也就是0
因此呢,通过以上的分析,大家想必对于上例也有了一番新的认识与理解,非常遗憾,这次的讲解再一次的结束了,我会在下一篇文章中给大家带来详细讲解的
完(结束).

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值