【问题标题】:Convert integer to byte array produces unexepected results将整数转换为字节数组会产生意想不到的结果
【发布时间】:2021-02-09 04:03:18
【问题描述】:

好的...这似乎是一个相当简单的问题,但我无法弄清楚这里发生了什么。我有以下代码将整数转换为字节数组并测试输出:

#include <stdio.h>

void int2bytearray(char *byte_array, int size, int num)
{
    for (int i = 0; i < size; i++)
    {   
        byte_array[i] = (num >> 8*i) & 0xFF;
    }   
}

int main()
{
    int test_int = 657850;
    int size = sizeof(int);
    
    printf("Size is %d\n", size);
    printf("Size of char is %d\n", (int)sizeof(char));
    
    char test_array[size];
    
    printf("Size of first entry %d\n", (int)sizeof(test_array[0]));

    int2bytearray(test_array, size, test_int);
    
    for (int i=0; i < size; i++)
    {   
        printf("%#02x", test_array[i]);
    }   

    printf("\nFirst byte is %#.2X", test_array[0]);

    return 0;
}

我希望 main 返回一个 bytes 数组,但第一个“字节”似乎是 32 位整数。

不幸的是,我得到以下输出:

Size is 4
Size of char is 1
Size of first entry 1
0xffffffba0x90xa00
First byte is 0XFFFFFFBA

谁能告诉我为什么第一个字节打印为0XFFFFFFBA?为什么它是 32 位整数而不是定义的字节?

【问题讨论】:

  • 因为对 signed 类型的位摆弄需要格外小心,并且结果是在最佳情况下定义的实现。如果它与您正在尝试做的事情一致,请使用无符号整数。
  • char test_array[size]; 可能是signed。因此,设置了第 7 位的原始值的任何部分都是负数,并且被符号扩展为 32 位以进行输出。 %X 格式处理 32 位值,任何较小的类型都提升为 32 位。

标签: c hex printf byte


【解决方案1】:

问题与所使用的类型以及打印值的方式有关。

数组中的第一个元素的值为0xBA,作为有符号的char,十进制为-70。当这个值被传递给printf 时,它被转换为int 类型,所以现在你有一个32 位的值-70,它的表示是0XFFFFFFBA,然后你使用%X 打印它,它会打印一个 unsigned int十六进制。

有两种方法可以解决此问题。

首先,将test_array的类型改为unsigned char。然后存储的值将是正数并正确打印。另一种选择是使用%hhX 作为格式说明符,该说明将值打印为unsigned char,这将打印正确的位数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多