在c ++中,我有以下代码:
int x = -3;
x &= 0xffff;
cout << x;
这会产生
65533
但如果我删除了否定词,那么我就有了这个:
int x = 3;
x &= 0xffff;
cout << x;
我只是得到3
为什么第一个结果不会产生负数?我希望-3将符号扩展为16位,这应该仍然给出二进制补码负数,考虑到所有这些扩展位都是1.因此最重要的位也是1。
答案 0 :(得分:5)
看起来您的系统使用32位int
,其中两个补码表示为负数。
常量0xFFFF
涵盖最不重要的两个字节,高两个字节为零。
-3
的值为0xFFFFFFFD
,因此使用0x0000FFFF
对其进行屏蔽,得到0x0000FFFD
或十进制为65533
。
正面3
为0x00000003
,因此使用0x0000FFFF
进行屏蔽会让您3
回来。
如果指定16位数据类型,例如
,您将得到预期的结果int16_t x = -3;
x &= 0xffff;
cout << x;
答案 1 :(得分:0)
在你的情况下,int超过2个字节。您可能在现代CPU上运行,通常这些天整数是4个字节(或32位)
如果您看看系统存储负数的方式,您会看到它是一个互补的数字。如果你的掩码是0xFFFF,那么你只需要最后2个字节,那么你只能得到它的一部分。
你的两个选择:
注意:我使用&#34;通常&#34;因为int和short中的位数取决于你的CPU和编译器。