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

在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;
上一篇:java-添加后出现意外结果


下一篇:大数据学习开发技术:MapReduce运行原理