将 4 元素字符数组复制到 C 中的整数

标签 c

一个字符是 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/

相关文章:

ios - 从 Objective-C 调用 C 函数 - 传递大量数据

c++ - WSARecvFrom 阻塞

c - 如何在 printf 中表示变量类型 unsigned long

二维粒子相互作用的 C 代码

c - 强制转换/赋值中不兼容的结构类型?

c - 这两行代码在程序中的工作

c - 未定义对确定价格的引用;计算;打印结果

c - C 中的面向对象程序 - 列表

iphone - 手动使用 CoreGraphics 绘制阴影?

c - 使用 Pthreads 的同步问题