将整数转换为字节数组会产生意想不到的结果
Convert integer to byte array produces unexepected results
好的...这似乎是一个相当简单的问题,但我不知道这里发生了什么。我有以下代码将整数转换为字节数组并测试输出:
#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 return 一个 字节数组 ,但第一个“字节”似乎是一个 32 位整数。
不幸的是,我得到以下输出:
Size is 4
Size of char is 1
Size of first entry 1
0xffffffba0x90xa00
First byte is 0XFFFFFFBA
谁能告诉我为什么第一个字节打印成 0XFFFFFFBA
?为什么是32位整数而不是定义的字节?
问题与所使用的类型以及打印值的方式有关。
数组中的第一个元素的值为 0xBA
,作为带符号的 char
,十进制为 -70。当这个值被传递给 printf
时,它被转换为类型 int
,所以现在你有一个 32 位值 -70 其表示是 0XFFFFFFBA
然后你使用 %X 打印它以十六进制打印 unsigned int
。
有两种方法可以解决这个问题。
首先,将 test_array
的类型更改为 unsigned char
。然后存储的值将为正值并正确打印。另一种选择是使用 %hhX
作为格式说明符,声明将值打印为 unsigned char
,这将打印正确的位数。
好的...这似乎是一个相当简单的问题,但我不知道这里发生了什么。我有以下代码将整数转换为字节数组并测试输出:
#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 return 一个 字节数组 ,但第一个“字节”似乎是一个 32 位整数。
不幸的是,我得到以下输出:
Size is 4
Size of char is 1
Size of first entry 1
0xffffffba0x90xa00
First byte is 0XFFFFFFBA
谁能告诉我为什么第一个字节打印成 0XFFFFFFBA
?为什么是32位整数而不是定义的字节?
问题与所使用的类型以及打印值的方式有关。
数组中的第一个元素的值为 0xBA
,作为带符号的 char
,十进制为 -70。当这个值被传递给 printf
时,它被转换为类型 int
,所以现在你有一个 32 位值 -70 其表示是 0XFFFFFFBA
然后你使用 %X 打印它以十六进制打印 unsigned int
。
有两种方法可以解决这个问题。
首先,将 test_array
的类型更改为 unsigned char
。然后存储的值将为正值并正确打印。另一种选择是使用 %hhX
作为格式说明符,声明将值打印为 unsigned char
,这将打印正确的位数。