我有一个“无符号短路”数组,即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 short *”转换为“unsigned int *”时,16位元素会自动交换!有谁知道这里发生了什么以及数据交换的原因?
答案 0 :(得分:1)
您的平台以小端格式表示数据,并通过将buff转换为(UINT32 *),您告诉编译器现在必须将buff解释为指向unsigned int的指针。指令
*((UINT32*)(buff)) = (value & 0xffff0000) + (value & 0xffff);
只需将“写入(值& 0xffff0000)+(值& 0xffff)写入此无符号整数(buff)”。这就是他所做的,他如何存储它不是你的事。您不应该访问较低或较高的16位,因为它取决于平台,哪一个首先出现。
所有你知道的是,如果你将buff作为unsigned int访问,你将获得与之前存储在那里相同的值,但假设任何特定的字节顺序是不安全的。
所以基本上你的代码有不确定的行为。