C++如何将两个带符号的8位数组合成16位短数?无法解释的结果

Nat*_*lie 11 c++ signed byte short

我需要将两个带符号的8位_int8值组合成一个有符号的短(16位)值.重要的是标志不会丢失.

我的代码是:

 unsigned short lsb = -13;
 unsigned short msb = 1;
 short combined = (msb << 8 )| lsb;
Run Code Online (Sandbox Code Playgroud)

我得到的结果是-13.但是,我预计它会是499.

对于以下示例,我使用相同的代码获得正确的结果:

msb = -1; lsb = -6; 合并= -6;

msb = 1; lsb = 89; 合计= 345;

msb = -1; lsb = 13; 合计= -243;

但是,msb = 1; lsb = -84; 合并= -84; 在哪里我期待428.

似乎如果lsb为负且msb为正,则出现问题!我的代码出了什么问题?计算机如何得到这些意外结果(Win7,64位和VS2008 C++)?非常感谢您的帮助!

Ret*_*nja 22

在这种情况下,你的lsb包含0xfff3.当你用1 << 8进行OR时,没有任何变化,因为该位的位置已经有1.

尝试 short combined = (msb << 8 ) | (lsb & 0xff);


Yli*_*sar 8

或使用联盟:

#include <iostream>

union Combine
{
    short target;
    char dest[ sizeof( short ) ];
};

int main()
{
    Combine cc;
    cc.dest[0] = -13, cc.dest[1] = 1;
    std::cout << cc.target << std::endl;
}
Run Code Online (Sandbox Code Playgroud)