我需要将两个带符号的 8 位 _int8 值组合成一个带符号的短(16 位)值。重要的是不要丢失标志。
我的代码是:
unsigned short lsb = -13;
unsigned short msb = 1;
short combined = (msb << 8 )| lsb;
我得到的结果是-13
。但是,我希望它是 499
。
对于下面的例子,我用相同的代码得到了正确的结果:
msb = -1; lsb = -6; combined = -6;
msb = 1; lsb = 89; combined = 345;
msb = -1; lsb = 13; combined = -243;
但是,msb = 1; lsb = -84; combined = -84;
我期望 428
。
好像lsb是负的,msb是正的,好像出问题了! 我的代码有什么问题?计算机如何得到这些意想不到的结果(Win7、64 位和 VS2008 C++)?
最佳答案
在这种情况下,您的 lsb 包含 0xfff3。当您将它与 1 << 8 进行或运算时,没有任何变化,因为该位位置已经有一个 1。
尝试 short combined = (msb << 8 ) | (lsb & 0xff);
关于C++ 如何将两个带符号的 8 位数字组合成一个 16 位短整数?无法解释的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8258398/