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

标签 c

嘿,我想将用户输入的 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/

相关文章:

c - 使用 VHDL 和 C 进行 FPGA 编程

c - 为什么 SPI 不适用于我的 STM32f4DISCOVERY?

c - 空白 'For' 循环提供输出

c - 在 C 宏中转换的可变参数函数

c - 如何通过多次调用获得程序的性能?

c++ - &&条件的执行方向

C 程序(malloc)未在 ubuntu 11.04 中编译

c - 如何取消引用 ASM 数据段中的指针?

创建随机位数组

c# - 将 C union 映射到 C# 结构