簡體   English   中英

將 uint32_t 數組的兩個元素轉換為單個 uint64_t 時,字節序如何交換元素的順序?

[英]How endianness swaps the order of elements, when converting two elements of uint32_t array to a single uint64_t?

我對字節順序如何在轉換為uint64_t時交換uint32_t數組元素的順序感到困惑,反之亦然。

如果我正在處理存儲在 8 個元素的 uint8_t 數組中的字節,如果我直接使用指針轉換和取消引用將其轉換為uint64_t ,如下所示:

uint8_t array[8] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0xb0, 0xa0};
uint64_t u = *(uint64_t *)array; 

在小端系統上, u等於0xa0b0ffeeddccbbaa

但是,如果我有一個這樣的uint32_t數組:

uint32_t arr[2] = {0xaabbccdd, 0xeeffb0a0} ;
uint64_t U = *(uint64_t *)arr;

在小端系統上, U變為0xeeffb0a0aabbccdd

我直觀地理解前一種情況,但后一種情況,由於uint32_t令人困惑,我在轉換過程中無法可視化 memory 布局。 在后一種情況下..,每一個幫助,將不勝感激!

Endianess單獨適用於 16 位或更大的每個 integer。 也就是說,在小端機器上,32 位 integer 0xaabbccdd存儲為dd cc bb aa

因此,兩個 32 整數uint32_t [2]的數組,其值為0x112233440x55667788被存儲為
分別為44 33 22 1188 77 66 55 在數組中,項目保證連續存儲,因此在這種情況下 memory 看起來像44 33 22 11 88 77 66 55

然而,一個 64 位 integer 0x1122334455667788被存儲為88 77 66 55 44 33 22 11 ,因為再次,字節序分別適用於每個 Z157DB7DF530023575515ZD366C9B672E。 這就是為什么您不能在小端機器上將兩個 32 位整數的 memory 布局重新解釋為 64 位 integer 的原因。

但是,如果 CPU 是大端,則uint32_t [2]將存儲為:
11 22 33 44 55 66 77 88然后它恰好得到與uint64_t相同的表示,值為0x1122334455667788


作為旁注,代碼中的*(uint64_t *)array轉換是未定義的行為,因為它們違反了嚴格的指針別名,並且還可能導致不對齊。 要安全地在不同的 memory 類型之間進行轉換,您需要使用位移、 memcpyunion

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM