在C中将4字节char转换为int32

时间:2011-11-17 19:24:40

标签: c

我首先将int32数字转换为char [4]数组,然后通过(int *)将数组转换回int32,但数字与之前的数字不同:

unsigned int num = 2130706432;
unsigned int x;
unsigned char a[4];

a[0] = (num>>24) & 0xFF;
a[1] = (num>>16) & 0xFF;
a[2] = (num>>8) & 0xFF;
a[3] = num & 0xFF;

x = *(int *)a;
printf("%d\n", x);

输出为127.如果我设置num = 127,则输出为2130706432。 有没有人有想法?

4 个答案:

答案 0 :(得分:17)

反转a []索引的顺序,例如。 a [0] - > [3]

我认为你有反向的结尾。

试试这个:

a[3] = (num>>24) & 0xFF;
a[2] = (num>>16) & 0xFF;
a[1] = (num>>8) & 0xFF;
a[0] = num & 0xFF;

答案 1 :(得分:9)

要了解会发生什么,请使用

printf("%x\n", ...);

打印输入和输出编号。

与Endian无关的方式:

x = (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];

答案 2 :(得分:5)

您的代码a[0] = (num>>24) & 0xFF;num获取最重要的8位,并将它们粘贴在a的第一个字节中。在小端机器上,第一个字节保持最不重要的位。这意味着在小端机器上,此代码占用最重要的8位并将它们存储在最低有效位的位置,从而改变值。

2130706432是十六进制的0x7F000000,127是0x0000007F。

此外,x = *(int *)a;会导致未定义的行为。考虑硬件,从不正确对齐的地址读取int会导致总线错误。如果a碰巧没有恰当地对齐int,那么程序就会崩溃。

将字节解释为int的正确方法是std::memcpy(&x, a, sizeof x);

答案 3 :(得分:2)

这条线永远无法在小端机器上正常工作:

x = *(int *)a;

您需要在打印值之前解压缩数据。