大小端问题

大小端问题是面试常考的题目,所以有必要总结一下。


1.什么是大小端?

小端:低位字节数据存储在低地址。
大端:高位字节数据存储在低地址。

for exemple:

int a=0x12345678;(a首地址为0x2000)
 0x2000  0x2001  0x2002  0x2003
 0x12      0x34      0x56      0x78      大端格式

 0x2000  0x2001  0x2002  0x2003
 0x78      0x56      0x34      0x12      小端格式

2.判断大小端(代码实现)?

方法一:

void checkCpuMode(void)
 {
  int i = 0x12345678;
  char *cp = (char *)&i;                      //取低地址
  if(*cp == 0x78)
   printf("little endian");
  else
   printf("big endian\n");
 }

方法二:

void checkCpuMode(void)
 {
  int a = 0x12345678;
  if((char)a == 0x12)                  //取低地址
   printf("big endian\n");
  else 
   printf("little endian\n");
 }

3.大小端问题出现的场景?

不同的cpu处理内存数据的方式不同,以及cpu和网络处理数据的方式也可能不同,所以要指明大端还是小端。尤其是在做跨平台的项目的时候 。大小端问题通常出现在网络编程中,例如:网络字节序是和大端系统一致。也就是网络上传输任何数据的时候,采用大端系统一致的存放方法。而通常pc架构貌似都是小端。

4.大小端转换宏?

#define swp16(x) ((((short)(x) & (short)0x00ff) << 8) | (((short)(x) & (short)0xff00) >> 8))


#define Swap32(A) ( (((uint32)(A) & (0xff000000)) >> 24) | (((uint32)(A) & (0x00ff0000)) >> 8) | (((uint32)(A) & (0x0000ff00)) << 8) | (((uint32)(A) & (0x000000ff)) << 24) )

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值