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

sta*_*low 15 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);
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)

  • 如果您不关心可移植性,那么这将起作用. (3认同)

Ada*_*hon 9

看看会发生什么用

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)

  • 我使用 `vector&lt;unsigned char&gt;` 并使用 `memcpy` 用 `uint32_t` 变量填充它:`memcpy(&amp;v[0], &amp;var, sizeof var);` (2认同)

Mik*_*ert 5

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

x = *(int *)a;
Run Code Online (Sandbox Code Playgroud)

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


bam*_*s53 5

您的代码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);