又是放松了一个假期接一个假期,小编我又回来了,长风破浪会有时,小编相信接下来会认认真真的对待这门的学习,不会像以前一样两天打鱼三天晒网,直挂云帆济沧海!
进入正题,这次小编学习到了又是一个特别重要的主题。
1.首先要知道数据在内存中的存储的什么形式
对与整形数据在内存中是以补码形式来存储的
说到补码,那肯定是联系到二进制,
正数的原码、反码和补码都是相等的;
而负数的反码等于原码按位取反,0变1,1变0,而补码就是反码+1,由补码得到原码也很简单,补码按位取反再+1就行了;
2.了解整形数据的存储方式后,要知道大小端字节序和字节序的判断
在超过一个字节的数据,在内存存储的时候,就会有顺序问题
举个例子 int a = 0x11223344;
大端字节序:将低字节的内容放到高地址处,将高字节内容放低地址处; 11223344
小端字节序:就是跟上面反过来; 44332211
为什么会有区分呢,大家都知道,电脑有分x64跟x86,x86对应的是小端,而x64就是大端
每种都有自己的优缺点,这里不多讲,一般现在都是x64大端的多一些。
一个字节8个比特位
那么char a = 1; 里面存储的就是int a = 1;内存的后8位:0000 0001
而char a = -1; 就是:1111 1111
来一道经典题型
int main()
{
int i = 0;
char a[1000];
for(i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
这道题的结果是255,为什么不是1000呢
上面说到char a只有8个比特位来存储内存,一旦数据内存超过8个比特位,而256正好超过,又因为char是有符号区分的,则char范围应该为-128到127。
所以这循环就是-1、-2、-3.....-127、128、127...2、1、0、-1...
但是strlen遇到\0就会停止,所以循环到0就会停止。
无符号的unsigned char的范围就是0到255了
3.接下来是浮点数在内存存储的形式
也是二进制,补码,不同的是小数点后面的
如5.5,的补码为0101.1(1.011*2^2)小数点后面对应的是2的负一、负二次方等等
浮点数内存的存储通常采用公式
浮点数V = (-1)^s * M * 2^E
S为符号位,对照5.5那个来M为1.011,E为2的次方是2
对于32位的浮点数来说,第一位为符号位,接着八位存储E(存储时省略第一位1,读取时再补。而且存储时要加入中间值127再转二进制),剩下的存储M(M总是大于等于1小于2)
64位则第一位符号位,接着十一位存储E(中间值1023),剩下M
将float a = 9.0内存形式写出
1.001*2^3
=(-1)^0 * 1.001 * 2^3
S = 0; M = 1.001; E = 3
所以为0(S) 0100 0010(E 127+3的二进制) 0010 0000 0000 0000 0000 000(M 001后面补0到23位)
因为E不恒大于0,所以要加中间值。
本次的知识分析到这里
如有错误请斧正!