我正在试验指针操作,并决定尝试通过使用 memcpy 从内存中直接复制来将数字数组转换为整数。
char aux[4] = {1,2,3,4};
int aux2 = 0;
memcpy((char*) &aux2, &aux[0], 4);
printf("%X", aux2);
我预计结果是 0x1020304,因为我将确切的字节从一个复制到另一个,但是 printf 给了我结果 0x4030201,这几乎是我想要的输出,只是倒退。为什么会发生这种情况,有没有办法以“正确”的顺序获得结果?
最佳答案
您的代码最多具有实现定义的行为,在某些情况下具有未定义的行为。
类型 int
大小可能与 4
不同:在 16 位系统上,int
通常只有 2
的大小字节。你会在这样的系统上有未定义的行为。
在常规 32 位系统上,int
有 4 个字节,但是这 4 个字节在内存中的存储顺序是实现定义的,这个问题称为 endianness :
01 02 03 04
表示值 0x01020304
在大端系统上,例如较旧的 Mac、一些手机和嵌入式系统。01 02 03 04
表示值 0x04030201
在小端系统上,比如你的。尽管令人惊讶,但小端顺序非常合乎逻辑,因为偏移量 处的字节包含表示 之间的值的位2n*8 和 2n*8+7 .字节顺序是一个文化问题,对于长期用户来说,这两种选择似乎都很自然。
在其他上下文中可以找到相同的变化,例如日期组件的排序:
2021.02.17
,17/02/2021
,02/17/2021
.这是一个更便携的版本来测试内存表示:
#include <stdio.h>
#include <string.h>
int main() {
unsigned int aux2 = 0x01020304;
unsigned char aux[sizeof(unsigned int)];
memcpy(&aux, aux2, sizeof(aux));
printf("%X is represented in memory as", aux2);
for (size_t i = 0; i < sizeof(aux); i++)
printf(" %02X", aux[i]);
printf("\n");
return 0;
}
关于c - 使用 memcpy 从数组转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66125278/