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

Dil*_*123 3 c++ bitmask bit

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

int x = -3;
x &= 0xffff;
cout << x;
Run Code Online (Sandbox Code Playgroud)

这产生了

65533
Run Code Online (Sandbox Code Playgroud)

但如果我删除否定,所以我有这个:

int x = 3;
x &= 0xffff;
cout << x;
Run Code Online (Sandbox Code Playgroud)

我只是得到3了结果

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

das*_*ght 5

看起来你的系统使用32位ints和负数的二进制补码表示.

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

的价值-30xFFFFFFFD,让掩盖它与0x0000FFFF0x0000FFFD,或65533十进制.

积极的30x00000003,所以掩盖与0x0000FFFF3回来.

如果指定16位数据类型,您将得到预期的结果,例如

int16_t x = -3;
x &= 0xffff;
cout << x;
Run Code Online (Sandbox Code Playgroud)