大端小端深入位剖析

大端:高位在低地址。

小端:底位在低地址。

区别:(举例)

1.字节层次。

如整数0x12345678在内存中应该如下存放:

地低: base   | base+1   | base+2   | base+3 | 
           ------------------------------------------------ |
大端    |   12   |    34     |    56     |    78      |
            ----------------------------------------------- |
小端    |    78   |     56     |    34     |     12    |

程序验证:

int _tmain(int argc, _TCHAR* argv[])
{

union UData {
   unsigned long integer;
   unsigned char array[4];
} Data;
Data.integer=0x12345678;
printf("%x/t%x/t%x/t%x/n",Data.array[0],Data.array[1], Data.array[2], Data.array[3]); 
return 0;
  
}

ps:一般PC是小端存储的。

2.字节内位序 。

在字节内依然是:

大端:高位放在低地址。
小端:低位放在低地址。

即大端与小端位序完全是镜像的,也许你会惊呀,会反对我。下面的程序会让反对的人哑口无言。

int _tmain(int argc, _TCHAR* argv[])
{
struct BitData {
   unsigned Bit0_3:4;
   unsigned Bit4_7:4;
   unsigned Bit8_11:4;
   unsigned Bit12_15:4;
};
union SData {
   unsigned short Data;
   struct BitData BData;
} ssData;
ssData.Data=0x1234;//此时BData与Data完全共享同一空间。
printf("%x/t%x/t%x/t%x/n",ssData.BData.Bit0_3,ssData.BData.Bit4_7,ssData.BData.Bit8_11,ssData.BData.Bit12_15);


return 0;
  
}

在运行程序前请先推理一下会输出什么,然后运行一下看看结果。是不是开始同意我了。

 

好了不说了。浪费了我几个小时的时间了。

 

 

 

顺便提一句,上述程序在普通PC上(小尾端)结果应该是:

4     3    2    1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值