为什么屏蔽负数会产生正数?

时间:2016-09-20 02:54:43

标签: c++ bit bitmask

在c ++中,我有以下代码:

int x = -3;
x &= 0xffff;
cout << x;

这会产生

65533

但如果我删除了否定词,那么我就有了这个:

int x = 3;
x &= 0xffff;
cout << x;

我只是得到3

为什么第一个结果不会产生负数?我希望-3将符号扩展为16位,这应该仍然给出二进制补码负数,考虑到所有这些扩展位都是1.因此最重要的位也是1。

2 个答案:

答案 0 :(得分:5)

看起来您的系统使用32位int,其中两个补码表示为负数。

常量0xFFFF涵盖最不重要的两个字节,高两个字节为零。

-3的值为0xFFFFFFFD,因此使用0x0000FFFF对其进行屏蔽,得到0x0000FFFD或十进制为65533

正面30x00000003,因此使用0x0000FFFF进行屏蔽会让您3回来。

如果指定16位数据类型,例如

,您将得到预期的结果
int16_t x = -3;
x &= 0xffff;
cout << x;

答案 1 :(得分:0)

在你的情况下,int超过2个字节。您可能在现代CPU上运行,通常这些天整数是4个字节(或32位)

如果您看看系统存储负数的方式,您会看到它是一个互补的数字。如果你的掩码是0xFFFF,那么你只需要最后2个字节,那么你只能得到它的一部分。

你的两个选择:

  1. 使用short而不是int。通常它是整数的一半,只有2个咬
  2. 使用更大的掩码,如0xFFFFFFFF,它覆盖整数的所有位
  3. 注意:我使用&#34;通常&#34;因为int和short中的位数取决于你的CPU和编译器。