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

我首先将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.有没有人有想法?

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

我认为你有反向的字节顺序。

试试这个:

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

看看会发生什么用

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

打印输入和输出编号。

与Endian无关的方式:

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

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

2130706432是hex的0x7F000000,127是0x0000007F。

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

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

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

 x = *(int *)a; 

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