本文談談嵌入式
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 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是最符合人的思維的位元組序...