大小端理解思想与测试代码

1 篇文章 0 订阅
1 篇文章 0 订阅

对于数据0x12345678
高字节为12
低字节为78
对于CPU来说:
小端模式,先取低字节数据,然后依次放入内存中
比如:
先取0x78放于第一个内存0x00,
再取0x56放于内存0x01
取0x34放于内存0x02
取0x12放于内存0x03

大端模式,先取高字节数据,然后依次放入内存中
比如:
先取0x12放于第一个内存0x00,
再取0x34放于内存0x01
再取0x56放于内存0x02
再取0x78放于内存0x03

这里有两点需要说明:
1.大小端只是影响CPU取字节的顺序,先取高字节(大端)或者先取低字节(小端),与内存无关。
2.内存是顺序分配,不管是大端模式还是小端模式,CPU取的第一个字节,放于内存0x00,第二个字节放于0x01,依次往后。

对于char 一个字节的数据,放于内存0x00。因为内存是顺序存放的。先分配0x00内存,再分配0x01内存。依次分配使用。

明白了这两点,我们就好理解测试CPU大小端模式的测试代码了:
1.测试代码一
int CheckCPU()
{
 union w
 {
  int i;
  char c;
 }b;
 b.i = 1;
 if(b.c == 1)
 {
  printf("Little Endian!\r\n");
 } 
 else
 {
  printf("Big Endian");
 }
 return (b.c == 1);/*return 1:Little Endian; return 0: Big Endian*/
}
解析:
对于小端模式,b.i = 0x00000001,取低字节0x01放于第一个内存0x00,然后依次往后。
分配内存:  0x00,0x01,0x02,0x03
所放数据为: 01 , 00, 00,  00


对于大端模式,b.i = 0x00000001,取高字节0x00,放于第一个内存0x00,然后依次往后。
分配内存: 0x00,0x01,0x02,0x03
所放数据为: 00,   00,  00,  01 

由于联合体int i 与char c共享内存,所以char c存放于内存0x00。
所以如果b.c == 1 (即内存0x00处存放如果数据为01),则是小端模式,否则为大端模式。

2.测试代码二
int CheckCPU(void)
{
 int i = 1;
 char *c = (char *)&i;
 if(*c == 1)
 {
  printf("Little Endian!\r\n");
 }
 else
 {
  printf("Big Endian");
 }
 return (*c == 1);/*return 1:Little Endian; return 0: Big Endian*/
}

原理与上相同,只是实现方式不同而已。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值