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

标签 c++ byte signed short

我需要将两个带符号的 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/

相关文章:

c++ - 为什么 -INT_MIN = INT_MIN 以带符号的二进制补码表示?

c++ - 在基类(模板)中定义但具有派生类类型的静态数据成员

c++ - 编译器会排除未使用的模板代码吗?

c++ - 是否有理由使用枚举在 C++ 代码中定义单个常量?

java.security.AccessControlException : access denied when running applet on browser

java - 如何以编程方式知道应用程序是否使用调试或导出证书签名?

c++ - QTableView实时过滤

c - 我如何获得C中变量的最低有效字节

c - 存储特定位数所需的字节数

c# - 如何在 C# 中从 byte[] 创建一个 bmp 文件