在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