首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将int转换为4字节的char数组(C)

将int转换为4字节的char数组(C)
EN

Stack Overflow用户
提问于 2010-09-24 12:50:24
回答 8查看 224.1K关注 0票数 83

嘿,我想把用户输入的int转换成4个字节,然后赋值给一个字符数组。如何做到这一点?

示例:

将用户输入175转换为

00000000 00000000 00000000 10101111

到目前为止所有答案的问题,转换255应该会导致0 0 0 ff,尽管它打印为:0 0 0 ffffffff

代码语言:javascript
复制
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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-09-24 13:38:52

要做到这一点,可移植的方法(确保您在任何地方都能获得0x00 0x00 0x00 0xaf )是使用shifts:

代码语言:javascript
复制
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,并且您使用的是下面这样的一行代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
printf("%x %x %x %x\n", (unsigned char)bytes[0],
                        (unsigned char)bytes[1],
                        (unsigned char)bytes[2],
                        (unsigned char)bytes[3]);
票数 158
EN

Stack Overflow用户

发布于 2010-09-24 13:11:58

您想要寻址32位整数的各个字节吗?一种可能的方法是联合:

代码语言:javascript
复制
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以反映无符号值。

票数 16
EN

Stack Overflow用户

发布于 2010-09-24 12:55:17

您可以尝试:

代码语言:javascript
复制
void CopyInt(int value, char* buffer) {
  memcpy(buffer, (void*)value, sizeof(int));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3784263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档