一个字符是 1 个字节,一个整数是 4 个字节。我想将 char[4] 中的字节逐字节复制到整数中。我想到了不同的方法,但得到了不同的答案。
char str[4]="abc";
unsigned int a = *(unsigned int*)str;
unsigned int b = str[0]<<24 | str[1]<<16 | str[2]<<8 | str[3];
unsigned int c;
memcpy(&c, str, 4);
printf("%u %u %u\n", a, b, c);
输出是 6513249 1633837824 6513249
哪个是正确的?出了什么问题?
最佳答案
这是一个 endianness问题。当您将 char*
解释为 int*
时,字符串的第一个字节成为整数的最低有效字节(因为您在小端 x86 上运行此代码), 而通过手动转换,第一个字节成为最重要的字节。
将其放入图片中,这是源数组:
a b c \0
+------+------+------+------+
| 0x61 | 0x62 | 0x63 | 0x00 | <---- bytes in memory
+------+------+------+------+
当这些字节在小端架构中被解释为整数时,结果是 0x00636261
,即十进制 6513249。另一方面,手动放置每个字节会产生 0x61626300
-- 十进制 1633837824.
当然,将 char*
视为 int*
是未定义的行为,因此在实践中差异并不重要,因为实际上不允许使用第一个转换.然而,有一种方法可以达到相同的结果,称为 type punning :
union {
char str[4];
unsigned int ui;
} u;
strcpy(u.str, "abc");
printf("%u\n", u.ui);
关于将 4 元素字符数组复制到 C 中的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19323806/