数据在内存中的存储

我们知道C语言中的数据类型可以分为以下几种类型,那么它们到底在内存中如何存储呢,今天我们来学习数据在内存中的存储。
在这里插入图片描述

1.整数在内存中的存储

实际上整形数据在内存中都是以补码形式存储的,那么什么是补码呢?
我们知道一个整形数据可以写成二进制的形式,那么整形数据的二进制数就是它的原码,一个正数的原码,反码,补码都是相同的。但是负数的原码,反码,补码就并不相同了。拿到负数的原码,符号位不变,其他位按位取反,这就得到了反码,再对反码加一,就得到了补码。(三种表示形式中第一位均为符号位,后面的为数值位)
下面我们在VS022上演示一下
在这里插入图片描述

-1的二进制为10000000 00000000 00000000 00000001 ,补码就是11111111 11111111 11111111 11111111换算成16进制就是ffffffff,在第一个图中我们可以看到-1在内存中以16进制ffffffff储存,换算成二进制就是11111111 11111111 11111111 11111111。
那为什么要用补码来储存数据呢?
原因在于,使⽤补码,可以将符号位和数值域统⼀处理;
同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是
相同的,不需要额外的硬件电路。

2.大小端字节序

如果数据的大小超过了一个字节,那么就会存在字节的存储顺序问题,在C语言中,有两种字节的存储顺序
分别是大端字节序存储和小端字节序存储。
大端字节序存储:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存
在内存的低地址处。
小端字节序存储:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存
在内存的⾼地址处。
大小端字节序讨论的是字节存储的方式,单位为字节。
大小端字节序的存储在C语言中并没有规定必须使用哪种,所以它取决与编译器的实现。
下面我们在VS2022中设置个简单的程序判断VS2022为哪种字节序存储方式:
在这里插入图片描述
从上图可以看出,a的类型是int ,是四个字节,内容是00 00 00 01,跟据大小端字节序的定义,如果是小端字节序那么01就在内存中储存在低位,00储存在高位,如果是大端字节序,00储存在低位,01储存在高位,对a强制类型转换成char*类型,访问的就是a在内存中储存的第一个字节,如果等于1就是小端字节序存储,等于0就是大端字节序存储。

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

根据IEEE754规定,一个浮点数的二进制位可以表示成V=(-1)^S * M * 2^E,其中S去0或1,如果S为0,则代表这个浮点数为正数,S为1则这个浮点数为负数,M表示有效数字,E为指数,例如浮点数5.5的二进制为101.1==1.011 * 2 ^2,S等于0,M等于1.011,E等于2。V=(-1) ^ 0 *1.011 * 2^ 2.
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
那么该怎么存入内存中呢?
IEEE 754同样对E和M的存入方式有着规定,我们发现M的开头总是不变的1,那么我们就可以将这个1补存入内存中,只存入小数点后面的位,这样就节省了空间。
对E的存储方式同样有着规定:在规定中E是一个无符号整数,但是在实际中E可能为负数,所以IEEE 754规定,对于32位的浮点数,E要加上一个127,对于64位浮点数,要加上1023,加之后再存入内存中。
上面规定了浮点数存入的规定,那么浮点数该如何取出呢?
对于S和M,怎样存入就怎样取出,但是取出E时存在三种情况:
1.E不全为0或1
这时只要将存入时加上的数减去,再加上存入时没有存的1就得到了真实值
2.E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还
原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字
3.E全为1
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)。
注意:有些浮点数并不能完全存入内存中,只能无限接近但不相等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值