嘿,我想将用户输入的 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
最佳答案
执行此操作的可移植方法(确保您到处都得到 0x00 0x00 0x00 0xaf
)是使用轮类:
unsigned char bytes[4];
unsigned long n = 175;
bytes[0] = (n >> 24) & 0xFF;
bytes[1] = (n >> 16) & 0xFF;
bytes[2] = (n >> 8) & 0xFF;
bytes[3] = n & 0xFF;
使用union和memcpy()
的方法在不同的机器上会得到不同的结果。
您遇到的问题是打印而不是转换。我假设您使用的是 char
而不是 unsigned char
,并且您正在使用这样的行来打印它:
printf("%x %x %x %x\n", bytes[0], bytes[1], bytes[2], bytes[3]);
当任何小于 int
的类型被传递给 printf
时,它们被提升为 int
(或 unsigned int
,如果 int
不能容纳原始类型的所有值)。如果 char
在您的平台上签名,则 0xff
可能不适合该类型的范围,而是被设置为 -1(表示为 0xff
在 2s 补码机上)。
-1 被提升为 int
,并且在您的机器上将 0xffffffff
表示为 int
,这就是您所看到的.
您的解决方案是要么实际使用 unsigned char
,要么在 printf
语句中转换为 unsigned char
:
printf("%x %x %x %x\n", (unsigned char)bytes[0],
(unsigned char)bytes[1],
(unsigned char)bytes[2],
(unsigned char)bytes[3]);
关于将 int 转换为 4 字节 char 数组 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3784263/