【发布时间】: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