其他分享
首页 > 其他分享> > c – 为什么屏蔽负数会产生正数?

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;

标签:bitmask,c,bit
来源: https://codeday.me/bug/20190828/1756080.html