我首先将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);
Run Code Online (Sandbox Code Playgroud)
输出是127.如果我设置num = 127,输出是2130706432.有没有人有想法?
Ant*_*ake 17
反转a []索引的顺序,例如.a [0] - > a [3]
我认为你有反向的字节顺序.
试试这个:
a[3] = (num>>24) & 0xFF;
a[2] = (num>>16) & 0xFF;
a[1] = (num>>8) & 0xFF;
a[0] = num & 0xFF;
Run Code Online (Sandbox Code Playgroud)
看看会发生什么用
printf("%x\n", ...);
Run Code Online (Sandbox Code Playgroud)
打印输入和输出编号.
与Endian无关的方式:
x = (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];
Run Code Online (Sandbox Code Playgroud)
您的代码a[0] = (num>>24) & 0xFF;会从中提取最高8位num并将其粘贴到的第一个字节中a。在小字节序机器上,第一个字节保留最低有效位。这意味着在小型字节序计算机上,此代码将获取最高有效的8位并将其存储在最低有效位所在的位置,从而更改值。
2130706432是十六进制的0x7F000000,而127是0x0000007F。
同样,x = *(int *)a;导致未定义的行为。考虑硬件,其中从不正确对齐的地址读取int会导致总线错误。如果a没有为int正确对齐,则程序将崩溃。
正确解释字节的int方法是std::memcpy(&x, a, sizeof x);