C++ 将16位有符号整数(两个&x27;s补码)的MSB和LSB连接起来

C++ 将16位有符号整数(两个&x27;s补码)的MSB和LSB连接起来,c++,integer,twos-complement,C++,Integer,Twos Complement,我正在使用一个专有协议,该协议将整数作为16位2的补码分两部分传输。首先传输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]; 无符号字符消息[BLK_SIZE]; //将LSB读取到消息[0],将MSB读取到消息[1] s

我正在使用一个专有协议,该协议将整数作为16位2的补码分两部分传输。首先传输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];
无符号字符消息[BLK_SIZE];
//将LSB读取到消息[0],将MSB读取到消息[1]

short my_int=(message[1]我相信如果
short
不是16位,代码将失败,因此您的代码可能会在某些平台上失败。不过,您可能永远也找不到它失败的平台


int16\t,如果在目标平台上可用,可能是一个更好的选择。

我认为如果
short
不是16位,代码将失败,因此您的代码可能在某些平台上失败。但您可能永远也找不到它失败的平台


int16\t(如果在目标平台上可用)可能是更好的选择。

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


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


在我看来还行-是什么让你认为它可能不正确?是的,它看起来还行。你应该为它编写一个测试,它会告诉你在你的特定应用程序的上下文中它是否还行。@Paul:啊,我应该提到这一点。我不确定,因为:1)IIRC short不能保证为16位。如果是8或32,会发生什么?2) 对一个无符号字符进行操作并按预期将其分配给一个短字符?@Neil:不幸的是,我还不能编写一个测试,因为我的规范中只有一个16位的单字符2的补码,LSB是第一个。短字符保证至少是16位。为了防止大于16位的可能性(非常罕见),请使用中的Posix类型-在这种情况下,这将是
int16\t
。在我看来,这是正常的-您为什么认为它可能不正确?是的,它看起来正常。你应该为它写一个测试,它会告诉你在你的特定应用环境中它是否合适。@Paul:啊,我应该提到这一点。我不确定,因为:1)IIRC short不能保证为16位。如果是8或32,会发生什么?2) 对一个无符号字符进行操作并按预期将其分配给一个短字符?@Neil:不幸的是,我还不能编写一个测试,因为我的规范中只有一个16位的单字符2的补码,LSB是第一个。短字符保证至少是16位。为了防止(非常罕见的)大于16位的可能性,请使用中的Posix类型-在本例中为
int16\t
。int16\t来自哪里?是标准C++、C还是一些POSIX?我应该更具体一些——如果短于16位,C++标准允许的话,我相信它会出现否定值。是标准C++、C还是一些POSIX的东西?我应该更具体一些——如果短于16位,这是C++的标准所允许的,我相信它会出现否定值。他希望一个特定于他自己的协议的转换。他希望一个特定于他自己的协议的转换。