目录
一,数据类型
类型的意义:
1:使用这个类型开辟内存空间的大小(大小决定了使用范围)。
2:看待内存的视角
二,整型在内存中存储
变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型来决定的。
1.原码,反码,补码
数据在内存中的以二进制的形式存储。
对于整型来说有三种形式:原码,反码,补码。
正整数的原码,反码,补码相同 ; 负整数的需要计算。
计算方式:反码是原码(最高位符号位不变)按位取反,补码是反码+1,如:
然后从右向左或从左向右八位一组写进内存
2.大小端介绍
上面我们说了,从右向左或从左向右八位一组写进内存,为什么会出现两种情况呢?这就引出了大小端问题。
2.1:大端存储模式
指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
2.2:小端存储模式
指数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中。
用图解去了解这两种存储模式。
不同的编译器存储的模式也会不一样,有的是大端有的是小端,如何判断自己的编译器是大端存储还是小端存储?
1.我们可以查看内存:
内存地址从左向右递增,可以看到是小端存储方式。
2.我们也可以通过代码的方式观察
int main()
{
int a = 1;
char* p = (char*)&a;
int pa = *p;
if (pa == 1)
{
printf("小端模式\n");
}
else
printf("大端模式\n");
return 0;
}
三,浮点型在内存中的存储
浮点型和整型在内存中的存储方式是有区别的
1,浮点数的存储方式
1.1 任意一个二进制的浮点数(V)可以表示成下面的形式:
(-1)^S * M * 2^ E
(-1)^S 表示符号位, 当 S = 0时,V为正数; 当S =1 时 V 为负数。
M 表示有效数字 ,大于等于1 , 小于 2。
2^E 表示指数位 。
例:
1.2 float和double存储方式有所区别:
2,对有效数字M和制数E
2.1有效数字M
M : 1<= M < ,默认M的第一位总是1,因此可以被舍去,只保存后面的小数部分,比如,保存1.01时,我们舍去有效数字1只保存01 ,等到读取的时候再把第一位的1加上去。
E : E位无符号整数,如果E为8位,则取值范围时0~255,若E为11位,取值范围是 0~2047
但是科学计数法中的E是可能会出现负数的,所以我们:
对于8位的E : E = E + 127
对于11位的E : E = E +1023
2.2 指数E的取出
1:E不全为0或者不全为1
指数E的计算值减去127(或1023)得到真实值。
2:E全为0
指数E等于1~127 (或 1~1023)即为真实值
有效数字M不再加上第一位的1 ,而是还原为0.XXXXXX的小数
(这样做是为了表示±0,以及接近于0的很小的数字)
3:E全为1
如果有效数字M全为0,表示 ± 无穷大(正负取决去S)