【问题标题】:4x8 bit int to 32 bit integer4x8 位整数到 32 位整数
【发布时间】:2011-06-10 01:39:45
【问题描述】:

我有

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

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

_int32 back = 3600;

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

【问题讨论】:

  • 您的代码无效,您无法创建包含 0 个元素的数组。

标签: c++ int 32-bit 8-bit


【解决方案1】:

将它们全部转换为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];

【讨论】:

  • 您可能希望或需要转换为 uint 以避免符号位扩展问题。
  • @hardmath:没错,我想这取决于他想要什么。
  • @hardmath 其实我不关注。使用左移时符号在哪里干预?如果彼得的回答有正确的转变,我会理解的,但在这里我觉得我错过了一些东西。
  • @Pascal Cuoq:当你进行转换时,签名会在轮班之前进行干预。如果我有一个有符号字节 int8 并转换为 int32,我希望将“负”值符号扩展为负值。也许gemaxas 的问题可以解释,但我阅读它的方式意味着只是将字节按正确的顺序排列。使用按位或来做到这一点(正如彼得建议的那样)将需要抑制任何符号扩展。 Nick 的解决方案(对同一块内存进行别名处理)可能更简洁一些,因为它避免了这个问题。
  • 我不明白为什么在联合可用时还要考虑位移。
【解决方案2】:

如果您知道字节顺序(即大端或小端,请在 wikipedia 上查看),并且您可以按照正确的顺序设置数组:

back = *(_int32 *)arr;

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

例如:

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

或类似的东西。

【讨论】:

  • ...x86 绝对是 little-endian。
  • x86 是小端; OP 的布局将是大端的。
  • 我不知道小端或大端,但这很有效:D 稍后会研究它。谢谢。
  • 不是通过错误类型未定义行为的指针访问值吗?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多