【发布时间】:2011-04-16 14:29:09
【问题描述】:
嘿,我希望将用户输入的 int 转换为 4 个字节,并将其分配给字符数组。如何做到这一点?
例子:
将用户输入的 175 转换为
00000000 00000000 00000000 10101111
到目前为止,所有答案都有问题,转换 255 应该会导致 0 0 0 ff 尽管它打印为:0 0 0 ffffffff
unsigned int value = 255;
buffer[0] = (value >> 24) & 0xFF;
buffer[1] = (value >> 16) & 0xFF;
buffer[2] = (value >> 8) & 0xFF;
buffer[3] = value & 0xFF;
union {
unsigned int integer;
unsigned char byte[4];
} temp32bitint;
temp32bitint.integer = value;
buffer[8] = temp32bitint.byte[3];
buffer[9] = temp32bitint.byte[2];
buffer[10] = temp32bitint.byte[1];
buffer[11] = temp32bitint.byte[0];
两者都导致0 0 0 ffffffff 而不是0 0 0 ff
另一个例子是 175,因为输入输出为 0, 0, 0, ffffffaf,而它应该只是 0, 0, 0, af
【问题讨论】:
-
你的 buffer[] 是如何定义的?值大于 127 的无符号字节设置了最高有效位。当使用有符号字节时,这表示负数。您的 FFFFFFFF 看起来像是对 0xFF 字节的符号扩展解释。
-
您应该使用 %hhx 格式来打印您的号码。
-
..但请注意
%hhx是 C99 添加的。 -
Nit:你不能保证 4 个字节对于保存一个 int 是必要的和足够的。你需要
sizeof (int)字节。 -
致那些可能遇到这篇文章的人:唯一正确的解决方案是在接受的答案中对无符号类型使用位移。你可以阅读那个并停在那里。它是最快和最便携的版本。
memcpy在无符号类型上是可以的,如果所有类型都是无符号的并且已经考虑了字节序。 union 解决方案不好,它们是不可移植的 - 当您可以通过同样的努力获得可移植代码时,为什么还要编写不可移植代码?指针算术解决方案不好,它们可能很慢,绝对不可移植,并且经常调用不明确的行为。
标签: c