C中大端小端的问题

   最近在牛客网经常遇到大端小端的问题,之前学嵌入式时51单片机也经常涉及大端小端模式的存储问题。以下是自己的理解和摘自牛客网的东西。

大端模式(Big- endian,就是数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这种存储模式和字符串的顺序处理类似(也可以这么记):地址由小向大增加,而数据从高位往低位放;    

小端模式(Little-endian,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和正常的逻辑思维一致。

一句话:采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。

以下是牛客网的表格解析示例:

例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存 放)为: 

内存地址

存放内容

0x4000

0x34

0x4001

0x12

而在Big-endian模式CPU内存中的存放方式则为: 

内存地址

存放内容

0x4000

0x12

0x4001

0x34

32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为: 

内存地址

存放内容

0x4000

0x78

0x4001

0x56

0x4002

0x34

0x4003

0x12

而在Big-endian模式CPU内存中的存放方式则为: 

内存地址

存放内容

0x4000

0x12

0x4001

0x34

0x4002

0x56

0x4003

0x78


我们可以用联合体union来检测CPU是大端还是小端存放。union中可以定义多个成员,但union的大小由最大的成员的大小决定。所以union成员共享同一块大小的内存(最大的成员,且要字节对齐!),且union 的存放顺序是所有成员都从低地址开始存放。

比如:

union
{
   int a;
  char str[13];
}
u;

sizeof(u)=16 .因为这里最大的是字符数组,但单个变量最大是int,它需要4字节对齐,所以字符数组需要取4的整补齐,就是16字节。

利用union的这些特性,编写如下函数,可以检测出到底是大端还是小端。

若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1

int checkCPU()
{
 {
 union w
 {
 int a;
 char b;
 } c;
 c.a = 1;
 return (c.b == 1);
 }
}
这是简单的函数写法,你也可以直接

<span style="font-size:14px;">union

{

   unsigned short int data;

   char  c[1];

}

 data =0x1234;

 c[0]=12 ? c[0]=34 ? //看大端还是小端
</span>





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值