3

我有

_int8 arr[0] = 0;
_int8 arr[1] = 0;
_int8 arr[2] = 14;
_int8 arr[3] = 16;

我需要将它转换为一个 _int32,使用 arr[0] 作为第一部分 <..> 和 arr[3] 作为最后一部分。最后应该是

_int32 back = 3600;

我应该使用位移或类似的东西来实现这一点吗?

4

3 回答 3

8

将它们全部转换为int然后使用:

(arr[0] << 24) | (arr[1] << 16) | (arr[2] << 8) | arr[3]

或者:

_int32 back = 0;
for (int i = 0; i < 4; ++i)
    back = (back << 8) | arr[i];
于 2011-01-16T17:51:37.660 回答
4

如果您知道字节顺序(即大端或小端,请在维基百科上查看),并且数组以正确的顺序设置,您可以这样做:

back = *(_int32 *)arr;

那只会将您的 4 字节数组解释为一个包含单个 32 位整数的缓冲区。不过,在您的示例中,我认为您已经为大端设置了它,而 x86 则没有。所以你需要交换一些字节。

例如:

_int32 back = arr[0] << 24 | arr[1] << 16 | arr[2] << 8 | arr[3];

或类似的东西。

于 2011-01-16T17:53:53.260 回答
1

这可能是我的 SCO 编译器,但我认为如果我不使用 (arr[0]&0xff) 等来进行轮班,我就会遇到问题。当然不会伤害任何东西。

于 2011-01-16T19:04:26.403 回答