整型的存储
整型的存储具体的内容之前已经在“操作符详解”,这一章讲过了。给出这这一章的链接。
大小端字节序的判断
上面这张图片中我们给a赋值了一个16进制的数字。我们发现在内存中的存储是以44 33 22 11的顺序存储的,而a的值是11 22 33 44,这是为什么呢?这就涉及到一个大小端字节序的判断。
与我们小学学的个位,十位类似,a的值也有高位和低位。这里11这边就是高位,44这边就是低位。可以看到调试中内存排布方式,低位这一端放在低内存处,高位这一端放在高内存处,这种排布方式就是小端字节序存储,相反上面一种就是大端字节序存储。下面我们设计一个程序来判断程序的字节序。
如图所示,为了取出内存中的低位数我们将整型的地址强制类型转换成char*,再次解引用就拿到的是第一个字节的数据直接返回即可。
浮点数的存储
接下来我们主要讲浮点数在内存中的存储。我们知道数据在内存中的存储形式是二进制,那么浮点数的存储第一步就是将十进制的浮点数转换成二进制的浮点数。如何实现下面我们给出一张图。
某知名机构规定一个E二进制的浮点数V可以写成以下形式。
V=(-1)^s * M * 2^E
1.(-1)^s为符号位,s = 0为正数,s = 1为负数;
2.M表示有效数字,范围为[1,2);
3.2^E表示指数位。
还是上面的例子1001.1 = (-1)^0 * 1.0011 * 2^3,E为3是因为小数点向前移动了三位,与十进制的科学计数法类似。则,s = 0,M = 1.0011,E = 3。
不知名机构规定,32位4字节浮点数float和64位8字节浮点数double的存储方式分别为
32位第1个bit存s,8个bit存E,23个bit存M 这里E存进去还要+127
64位第1个bit存s,11个bit存E,52个bit存M 这里E存进去还要+1023
这就是浮点数在内存中的存储方式。
那么存了之后该如何取出来呢?
1.E全为0,M直接取出来,还原为0.xxxxxx的小数表示0或者很小。
2.E全为1,表示正负无穷;
3.E为除上述两种情况以外的常规情况,E-127或者-1023,M+1。
我们不是规则制定者,所以以上情况没有为什么。