【问题标题】:C++ - Bit shifting returning negative numbers [duplicate]C ++ - 返回负数的位移[重复]
【发布时间】:2015-10-22 09:08:39
【问题描述】:

我在尝试在 C++ 中使用位移时遇到了一些麻烦。

我有一个char a = 160char b = 0。 a 的值为0b10100000。我想将a 的最左边的位移动到b,以便b 的值为2 (0b10)。按照我的逻辑,应该这样做:

b = (b << 2) | (a >> 6);

但是,当我检查 b 中的值时,它是 -2 而不是 2,正如我所期望的那样。将其转换为 unsigned char 会将其值更改为 254。

我做错了什么?

【问题讨论】:

  • (b &lt;&lt; 2) 如果b==0 是完全没有必要的;如果你只是 char b= a &gt;&gt; 6; 会发生什么?
  • char --> unsigned char
  • @JoachimPileborg 的想法完全一样,但我不知道任何机器的整数最高位为零来描述负数
  • 可能您的char a = 160 并不是真正的 160,而是类似于 -96 的值(提示:如果 char 已签名,则最大值为 127,而 160 已超过此限制)。
  • @JoachimPileborg 啊没关系,我很愚蠢; 160 当然最高位设置为 1....

标签: c++ bit-shift


【解决方案1】:

这两种类型都必须是无符号的:

unsigned char a = 160;
unsigned char b = 0;
b = (b << 2) | (a >> 6);

完全一样:

unsigned char c = a >> 6;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多