我有一个“无符号短”数组,即 C 中每个元素 16 位。我有两个“无符号短”值,它们应该以小端顺序写回数组中,这意味着最不重要的元素将首先出现。例如,如果我有以下值:
unsigned int val = 0x12345678;
它应该存储在我的数组中:
unsigned short buff[10];
buff[0] = 0x5678;
buff[1] = 0x1234;
我编写了一个代码来一次写入值,而不是提取 int 值的高低 16 位并分别编写它们,因为可能存在原子性问题。我的代码如下所示:
typedef unsigned int UINT32;
*((UINT32*)(buff)) = (value & 0xffff0000) + (value & 0xffff);
令人惊讶的是,上面的代码可以正常工作,结果将是:
buff[0] is 0x5678;
buff[1] is 0x1234;
问题是,如图所示,我以大端顺序保存“无符号短”值,而不是我希望的小端。换句话说,当我将指针从“unsigned short*”转换为“unsigned int*”时,16 位元素会自动交换!有谁知道这里发生了什么以及为什么数据被交换?