![](/img/trans.png)
[英]64-bit copy from uint32_t[16] array to sequence of uint32_t variables
[英]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]
的數組,其值為0x11223344
和0x55667788
被存儲為
分別為44 33 22 11
和88 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 類型之間進行轉換,您需要使用位移、 memcpy
或union
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.