在c中,我有以下代码:
int x = -3;
x &= 0xffff;
cout << x;
这产生了
65533
但如果我删除否定,所以我有这个:
int x = 3;
x &= 0xffff;
cout << x;
结果我得到3分
为什么第一个结果不会产生负数?我期望-3将符号扩展到16位,这应该仍然给出二进制补码负数,考虑到所有这些扩展位都是1.因此最重要的位也是1.
解决方法:
看起来你的系统使用32位整数和负数的二进制补码表示.
常量0xFFFF覆盖最不重要的两个字节,高两个字节为零.
-3的值是0xFFFFFFFD,因此用0x0000FFFF屏蔽它,得到0x0000FFFD,或十进制65533.
正3为0x00000003,因此使用0x0000FFFF进行屏蔽会使您返回3.
如果指定16位数据类型,您将得到预期的结果,例如:
int16_t x = -3;
x &= 0xffff;
cout << x;