在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
。
正3
是0x00000003
,因此使用0x0000FFFF
进行屏蔽可以使您返回3
。
如果指定16位数据类型,例如,您将获得预期的结果。
int16_t x = -3;
x &= 0xffff;
cout << x;