字节序和字宽的影响

 

本文谈谈嵌入式cpu的字节序和字节位宽对软件可移植性的影响,假设有AB两台不相同的计算机之间互相通信。有下列数据结构定义:

union data_pack

{
    
unsigned long word;
    
unsigned char bytes[4];
  };

A计算机中,用下列语句:

union data_pack bufA;

bufA.word = 0x12345678

fori = 0; i < 4; i++

{

      send_byte(bufA.bytes[i]);

}

把数据发送到B计算机上,B机用下列代码接收:

union data_pack bufB;

fori = 0; i < 4; i++

{

      bufB.bytes[i] = read_byte( );

}

这样,B机能否正确接收数据呢?答案并不肯定。

如果A机和B机的平台相同的话,B机能够收到正确的数据。

即使AB机的硬件完全一致,但编译器对存储器大小端设置不一致的话,将有bufB.word=0x78563412为什么会这样呢?假定A机是小端存储,而B机是大端存储,那么bufAbufBAB中的存储格式如下表

 

 

A

B

base address +3

0x12

word[31:24]

bytes[3]

word[7:0]

bytes[3]

base address +2

0x34

word[23:16]

bytes[2]

word[15:8]

bytes[2]

base address +1

0x56

word[15:8]

bytes[1]

word[23:16]

bytes[1]

base address

0x78

word[7:0]

bytes[0]

word[31:24]

bytes[0]

显然,A机中,0x12出现在word的最高字节位置,在B机中则变成最低字节位置了。

如果说大小端问题还比较常见的话,那么,目标机字节位宽的问题,隐藏得就比较深了。即使双机的大小端设置相同,但双击字节位宽不同的话,bufB.word也不能得到正确的值,如下表所示。

A机字节宽度

B机字节宽度

B机收到的bufB.word

8

8

0x12345678

8

16

0x560078

16

8

0x340078

8

32

0x78

32

8

0x78

16

32

0x78

32

16

0x78

因此,这段程序在不同的硬件体系上运行时,结果可能不是我们所希望的,那这段代码怎样写,才能得到正确的结果呢?下面是一个更安全的代码,无论A机和B机的字节序和字节位宽如何,都可以得到正确的结果,代价是,执行时间会长一些,代码占用的空间也会大一些。

A机代码:

unsigned long word;
  unsigned char bytes[4];

word = 0x12345678
   bytes[3] = (word>>24) & 0xff;
  
bytes[2] = (word>>16) & 0xff;
  
bytes[1] = (word>>8) & 0xff;
  
bytes[0] = word & 0xff;
   for


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值