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

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

这产生
65533

但是,如果我消除了负面因素,那么我就会这样:
int x = 3;
x &= 0xffff;
cout << x;

我只是得到3
为什么第一个结果不产生负数?我希望将-3的符号扩展为16位,考虑到所有扩展位均为1,它仍应提供二进制补码负数。因此,最高有效位也将为1。

最佳答案

看来您的系统使用带有负数的二进制补码表示形式的32位int

常量0xFFFF覆盖了最低有效的两个字节,最高的两个字节为零。
-3的值为0xFFFFFFFD,因此用0x0000FFFF屏蔽它,您会得到0x0000FFFD或十进制的65533

30x00000003,因此使用0x0000FFFF进行屏蔽可以使您返回3

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

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

09-07 06:49