【问题标题】:Join MSB and LSB of a 16 bit signed integer (two's complement)连接 16 位有符号整数的 MSB 和 LSB(二进制补码)
【发布时间】:2010-07-05 15:51:42
【问题描述】:

我正在使用一种专有协议,该协议将整数作为 16 位二进制补码分两部分传输。首先发送 LSB,然后发送 MSB。下面恢复原值的代码是否正确?

unsigned char message[BLK_SIZE];
// read LSB to message[0] and MSB to message[1]
short my_int = (message[1] << 8) | message[0];

【问题讨论】:

  • 对我来说看起来不错 - 是什么让您认为它可能不正确?
  • 是的,看起来不错。您应该为它编写一个测试,它会告诉您它在您的特定应用程序的上下文中是否可以。
  • @Paul:啊,我应该提到这一点。我不确定,因为:1)IIRC short 不能保证是 16 位的。如果它是 8 或 32 会发生什么? 2)对无符号字符进行操作并按预期将其分配给简短的作品?
  • @Neil:不幸的是,我还不能编写测试,因为我只有规范说这是一个 16 位二进制补码并且 LSB 是第一个。
  • short 保证至少 16位。为了防止它(非常罕见)超过 16 位的可能性,请使用 中的 Posix 类型 - 在这种情况下,这将是 int16_t

标签: c++ integer twos-complement


【解决方案1】:

我相信如果short 不是 16 位,代码将会失败,因此您的代码在某些平台上可能会失败。不过,您可能永远找不到失败的平台。

int16_t,如果在您的目标平台上可用,可能是更好的选择。

【讨论】:

  • int16_t 从何而来?那是标准的 c++、c 还是一些 POSIX 的东西?
  • 我应该更具体一点 - 我相信如果 short 大于 大于 C++ 标准允许的 16 位,负值会失败。
【解决方案2】:

您的代码看起来正确,但您可以使用内部 C 函数来确保您的协议真正独立于平台:

short my_int = ntohs(*(short*)message)

【讨论】:

  • 他想要一个特定于他自己协议的转换。
猜你喜欢
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多