位元組序和字寬的影響

2021-05-23 19:18:24 字數 1869 閱讀 3932

本文談談嵌入式

cpu的位元組序和位元組位寬對軟體可移植性的影響,假設有a、

b兩台不相同的計算機之間互相通訊。有下列資料結構定義:

union data_pack ; 在

a計算機中,用下列語句:

union data_pack bufa;

bufa.word = 0x12345678

;for

(i = 0; i < 4; i++)

把資料傳送到

b計算機上,

b機用下列**接收:

union data_pack bufb;

for(

i = 0; i < 4; i++)

這樣,b

機能否正確接收資料呢?答案並不肯定。如果a

機和b機的平台相同的話,

b機能夠收到正確的資料。即使a

和b機的硬體完全一致,但編譯器對儲存器大小端設定不一致的話,將有

bufb.word=0x78563412

。為什麼會這樣呢?假定

a機是小端儲存,而

b機是大端儲存,那麼

bufa

和bufb在a

和b中的儲存格式如下表: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 longword;

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

位元組序和網路位元組序

1 位元組序 由於不同的計算機系統採用不同的位元組序儲存資料,同樣乙個4位元組的32位整數,在記憶體中儲存的方式就不同.位元組序分為小尾位元組序 little endian 和大尾位元組序 big endian intel處理器大多數使用小尾位元組序,motorola處理器大多數使用大尾 big e...

位元組序和網路位元組序

1位元組序 由於不同的計算機系統採用不同的位元組序儲存資料,同樣乙個4位元組的32位整數,在記憶體中儲存的方式就不同.位元組序分為小尾位元組序 little endian 和大尾位元組序 big endian intel處理器大多數使用小尾位元組序,motorola處理器大多數使用大尾 big en...

網路位元組序和主機位元組序

不同的 cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種1 little endian2 big endian le little endian 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是最符合人的思維的位元組序...