嘿,我想把用户输入的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, af
,但却打印为0, 0, 0, ffffffaf
发布于 2010-09-24 13:38:52
要做到这一点,可移植的方法(确保您在任何地方都能获得0x00 0x00 0x00 0xaf
)是使用shifts:
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;
使用联合和memcpy()
的方法在不同的机器上会得到不同的结果。
您遇到的问题是打印而不是转换。我假设您使用的是char
而不是unsigned char
,并且您使用的是下面这样的一行代码:
printf("%x %x %x %x\n", bytes[0], bytes[1], bytes[2], bytes[3]);
当将比int
更窄的任何类型传递给printf
时,它们将被提升为int
(如果int
不能包含原始类型的所有值,则为unsigned int
)。如果char
是在您的平台上签名的,那么0xff
可能不适合该类型的范围,而是将其设置为-1 (在2s补码机器上具有0xff
表示)。
提升为-1 \f25 int
-1\f6,并在机器上将-1\f25 0xffffffff
-1\f6表示为-1\f25 int
-1\f6,这就是您所看到的。
您的解决方案是要么实际使用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]);
发布于 2010-09-24 13:11:58
您想要寻址32位整数的各个字节吗?一种可能的方法是联合:
union
{
unsigned int integer;
unsigned char byte[4];
} foo;
int main()
{
foo.integer = 123456789;
printf("%u %u %u %u\n", foo.byte[3], foo.byte[2], foo.byte[1], foo.byte[0]);
}
注:更正了printf以反映无符号值。
发布于 2010-09-24 12:55:17
您可以尝试:
void CopyInt(int value, char* buffer) {
memcpy(buffer, (void*)value, sizeof(int));
}
https://stackoverflow.com/questions/3784263
复制相似问题