数据在内存中的存储方式

在vs的调试过程中,我们可以调出内存查看窗口和监视窗口。
我们先来看个东西,我们在vs中定义一个int类型的变量a
在这里插入图片描述
在这里插入图片描述
可以发现a的内存地址是0x0019feec
在这里插入图片描述
44存在了0019FEEC上
33存在了0019FEED上
22存在了0019FEEE上
11存在了0019FEEF上
和我们想的好像不太一样。这涉及到大小端的知识。
按我们平时的数学思路来说11223344的11属于最高位,44属于最低位;而在内存中0019FEEC是最低位,0019FEEF是最高位。
大端:将数字的较低位,存储在内存的较高地址处
小端:将数字的较低位,存储在内存的较低地址处

可见我们上面是采用了小端的方式来存数据的。
到底是大端方式还是小端方式,是由CPU的架构决定的,Intel出产的X86架构以及AMD系列(PC上最常采用),他们都是小端方式。
————————————————————————————————————————————————————————

以上我们是用正数来举例的,那我们来看看负数是怎么存储的。
按约定把第一位用来表示符号,0代表正,1代表负,那-1就可以写成101,而1就可以写成001,这样就会出现一个问题,-1+1应该是=0,但是101+001=110,110就是-2,因此这样是不行的,继而就产生了补码。
所谓补码是针对负数来说的,正数的补码是他本身,负数的补码是其按位取反加一。
举个例子-1,二进制就是101,取反010,+1=011,而011+001=000,解决了上面的那个问题。
因此,在内存中,数据是以补码的方式存在的

————————————————————————————————————————————————————————
介绍完int类型的,我们来看看浮点型是怎么在内存中存储的。
float:4个字节,也就是32位。采用的是IEEE所设计的浮点编码方案。

  • 首先,先换成2进制:如二进制的11.01=121+1*20+02(-1)+1*2(-2)=十进制的3.25
  • 把他换成科学计数法(IEEE规定把小数点移动到不为零的第一数的后面):11.01把小数点前移一位–>1.101
  • 存储规则:
最高位(第33位) 存储符号(0为正1为负)因此1.101就是0
后面8位(第24-32位) 存放指数(采用127+/-一个数的方式)【因为指数有正也有负,IEEE为了均衡其数量,取了个中间值127,这样就可以保证他们的范围取值好计算,+代表左移,-代表右移】1.101左移了1位所以是127+1=128,所以就是100 0000 0
因为换成二进制后移位,第一位一定是1,所以没有必要存
其他位用来存小数,1.101的小数部分是101,不够就补0,就是101 0000 0000 0000 0000 0000

这个数就是0100 0000 0101 0000 0000 0000 0000 0000
16进制:0X40 50 00 00
因为是小端的方式,所以就是00 00 50 40自行验证吧。
float的方式可以总结为1+8+23
double和它差不多可以总结为1+11+52

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值