Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 4x8位整数到32位整数_C++_Int_32 Bit_8 Bit - Fatal编程技术网

C++ 4x8位整数到32位整数

C++ 4x8位整数到32位整数,c++,int,32-bit,8-bit,C++,Int,32 Bit,8 Bit,我有 我需要将其转换为一个_int32,使用as arr[0]作为第一部分,arr[3]作为最后一部分。 最终应该是这样的 _int8 arr[0] = 0; _int8 arr[1] = 0; _int8 arr[2] = 14; _int8 arr[3] = 16; 我应该使用位移位或类似的smth来实现这一点吗?将它们全部转换为int,然后使用: _int32 back = 3600; (arr[0]如果您知道字节顺序(即big-endian或little-endian,请在wikip

我有

我需要将其转换为一个_int32,使用as arr[0]作为第一部分,arr[3]作为最后一部分。 最终应该是这样的

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

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

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

_int32 back = 3600;

(arr[0]如果您知道字节顺序(即big-endian或little-endian,请在wikipedia上查看),并且数组的设置顺序正确,您可以执行以下操作:

_int32 back = 0;
for (int i = 0; i < 4; ++i)
    back = (back << 8) | arr[i];
这只是将4字节数组解释为一个包含单个32位整数的缓冲区。不过,在您的示例中,我认为您已经为big-endian设置了它,而x86没有。因此您需要交换一些字节

例如:

back = *(_int32 *)arr;

\u int32 back=arr[0]这可能是我的SCO编译器,但我认为如果我不使用(arr[0]&0xff),我会遇到问题等等。当然不会有任何伤害。

您可能想要或需要转换为uint以避免符号位扩展出现问题。@hardmath:是的,我想这取决于他想要什么。@hardmath实际上我不明白。使用左移位时,符号在哪里干预?如果Peter的答案中有右移位,我会我本来会理解的,但在这里我觉得我遗漏了一些东西。@Pascal Cuoq:Signedness会在转换之前介入,当你进行转换时。如果我有一个带符号字节int8并转换为int32,我希望是“负的”要将值符号扩展为负值。也许gemaxas的问题可以解释,但我的理解方式意味着只需将字节按正确的顺序排列。使用按位OR(正如Peter建议的那样)将需要抑制任何符号扩展。Nick的解决方案(对同一块内存进行别名)可能会更干净一点,因为它避免了这个问题。我永远不明白为什么在联合可用的情况下甚至会考虑位移位…x86是最确定的little-endian。x86是little-endian;OP的布局将是big-endian。我不知道little或big-endian,但这起作用了:D稍后会研究它。谢谢。通过ugh指针类型错误未定义行为?您的代码无效,无法创建包含0个元素的数组。
back = *(_int32 *)arr;
_int32 back = arr[0] << 24 | arr[1] << 16 | arr[2] << 8 | arr[3];