![](/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.