一、数据在内存中的存放方式
数据在存放到内存里的时候,有两种存放方式,即:Big Endian 和 Little Endian
- Big Endian(大端模式/网络字节序):内存中的高位存放数据的低位,内存中的低位存放数据的高位
- Little Endian(小端模式/主机字节序/反字节序):内存中的高位存放数据的高位,内存中的低位存放数据的低位
注:PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据
为了更好理解,比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:
- Big Endian(符合正常的思维习惯)
低地址 -----------------------------------------------------------------------------> 高地址
| 12 | 34 | 56 | 78 |
- Little Endian
低地址 -----------------------------------------------------------------------------> 高地址
| 78 | 56 | 34 | 12 |
由此,我们可以通过共用体来判断一台机器使用的存储方式,因为共用体的存放顺序是所有成员从低地址开始存放。
二、浮点数在内存中的存储方式
对于浮点数在内存是如何存储的,目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。
在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。对于float型数据,其二进制有32位,其中符号位1位,阶码8位,尾数23位;对于double型数据,其二进制为64位,符号位1位,阶码11位,尾数52位。
- 符号位:0表示正,1表示负
- 阶码:这里阶码采用移码表示,对于float型数据其规定偏置量为127,阶码有正有负,对于8位二进制,则其表示范围为-128-127,double型规定为1023,其表示范围为-1024-1023。比如对于float型数据,若阶码的真实值为2,则加上127后为129,其阶码表示形式为10000010
- 尾数:有效数字位,即部分二进制位(小数点后面的二进制位),因为规定M的整数部分恒为1,所以这个1就不进行存储了。
下面举例说明:
float型数据125.5转换为标准浮点格式是什么?
答:125二进制表示形式为1111101,小数部分表示为二进制为 1,则125.5二进制表示为1111101.1,由于规定尾数的整数部分恒为1,则表示为1.1111011*2^6,阶码为6,加上127为133,则表示为10000101,而对于尾数将整数部分1去掉,为1111011,在其后面补0使其位数达到23位,则为11110110000000000000000
综上:则其二进制表示形式为:0 10000101 11110110000000000000000
则在内存中存放方式为(x86情况):
00000000 低地址
00000000
11111011
01000010 高地址