繁体   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