我首先将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。 有没有人有想法?
答案 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;
您需要在打印值之前解压缩数据。