Record and Summarize

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、数据在内存中的存放方式

数据在存放到内存里的时候,有两种存放方式,即: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 高地址

posted on 2013-12-29 22:41  zhangjing327  阅读(946)  评论(0编辑  收藏  举报