打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
c语言大小端问题
1)、大小端问题
在计算机中存在两种字节序:大端和小端,大端是指计算机中表示一个数时高位在前,低位在后,也就是说低地址存放数据的高位部分,而高地址存放数据的低位部 分,如PPC就是属于这种类型的;相对的,小端是指计算机存储数据时低位在前,高位在后,即低地址存放数据的低位部分,高地址存放数据的高位部分,我们天 天用的X86 CPU就是这样的。
   例如: 0x12345678在大小端系统中分别表示如下:
   Address      : 0x500 0x501 0x502 0x503
           +-------+------+-------+-------+
LittleEndian : | 0x78 | 0x56 | 0x34 | 0x12 |
       +-------+------+-------+-------+
           +-------+------+-------+-------+
BigEndian    : | 0x12 | 0x34 | 0x56 | 0x78 |
       +-------+------+-------+-------+
可以用如下方法来判断一个CPU的大小端:
boolean IsBigEndian(void)
{
      U16 wTest = 0x1234;
      U8* puTest = (U8*)&wTest;
      if (0x12 == puTest[0])
      {
          return true;
      }
      else
      {
          return false;
      }
}
2)、 字节对齐问题
    我们先来看这样一个问题:
    typedef struct
    {
     U8   bFieldA;
        U16 wFieldB;
        U8   bFieldC;
        U32 dwFieldD;
    }STRUCT_A;

    typedef struct
    {
     U8   bFieldA;
        U8   bFieldC;
        U16 wFieldB;
        U32 dwFieldD;
    }STRUCT_B;
    请问:sizeof(STRUCT_A) = ? sizeof(STRUCT_B) = ?
    这个问题涉及的就是字节序问题,字节序问题关系到数据结构设计的是否合理,合理的数据结构设计可以节省内存空间,同时还能够提高数据访问效率,这在资源有限的其嵌入式系统中是非常重要的.
    在一个四字节对齐的系统中,STRUCT_A占用的内存空间为12字节,而STRUCT_B占用的内存空间则是8字节,比STRUCT_A少了4个字节!从这里我们就可以看出字节对齐的重要性了!
    那么字节到底怎么对齐呢?为什么会有字节对齐的问题呢?引起这个问题的主要原因是CPU的机器字设计。机器字是指CPU一次内存访问指令能够读取的字节个 数,四字节对齐的CPU中,一条内存访问指令可以读取四个字节。而编译器生成数据结构时一般都会保证数据访问效率最高,即基本数据类型 (U8/U16/U32)要保证一条指令就能够访问完,于是就产生了U8类型1字节对齐,U16类型2字节对齐,U32类型四字节对齐。这样我们就可以看 看上面两个结构中,各个域的内存占用情况:
在STRUCT_A中,bFieldA单对齐,占用一个字节;wFieldB双字节对齐,为了保证wFieldB能够自然对齐,在bFieldA之后就会 空出一个字节,从第三个字节开始;bFieldC单字节对齐;dwFieldD四字节对齐,为了保证dwFieldD能够自然对齐,在bFieldC之后 就会空出三个字节,这样算来整个结构共占用12个字节(包含了三个空余字节),其内存结构如下图(*表示预留字节):
         +-----+-----+----+----+----+----+----+----+----+----+----+----+
          | A   |    *   | B | B | C |   * |   * |   * | D   | D   | D   | D |
         +-----+-----+----+----+----+----+----+----+----+----+----+----+
类似的,STRUCT_B结构内存结构如下:
         +-----+-----+----+----+----+----+----+----+
          | A    | C   | B | B | D | D | D | D |
         +-----+-----+----+----+----+----+----+----+
从这个简单的例子我们可以看出,即使结构的所有内容相同,仅仅结构中数据成员排序的不同都会引起数据结构所占内存空间的很大的区别!
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
long long 类型的网络字节顺序转换
单峰密集(转则呜)
关于内存地址和寄存器中的高位和低位简介
高位字节,低位字节应该怎么理解
字节存储顺序(大端和小端)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服