嘿,我想把用户输入的int转换成4个字节,然后赋给一个字符array.怎样才能做到这一点呢?

示例:

将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

推荐答案

实现这一点的portable种方法(确保你在任何地方都得到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;

使用联合和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(在2s补码机上有0xff表示).

-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]);

C++相关问答推荐

在32位处理器上优化53—32位模计算>

使用NameSurname扫描到两个单独的字符串

减法运算结果的平方的最快方法?

为什么I2C会发送错误的数据?

我无法让LLDB正确运行我的可执行文件

可以将C变量限制为特定的读/写速度吗?

平均程序编译,但结果不好

如何在C++中处理按键

为什么我的Hello World EFI程序构建不正确?

在Linux上使用vscode和lldb调试用Makefile编译的c代码

如何在C宏定义中包含双引号?

当用C打印过多的';\n';时输出不正确

生成一个半RNG,结果用C表示(无随机/随机)

将复合文字数组用作临时字符串缓冲区是否合理?

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

C:面筋蛋白';为什么不刷新窗口?

通过char*访问指针的对象表示是未定义的行为吗?

为什么 C 字符串并不总是等同于字符数组?

如何确定 C 程序中的可用堆内存

char* 上的 free() 被 valgrind 识别为无效