[英]Why does masking a negative number produce a positive number?
在 C++ 中,我有以下代码:
int x = -3;
x &= 0xffff;
cout << x;
这产生
65533
但如果我删除否定,那么我有这个:
int x = 3;
x &= 0xffff;
cout << x;
结果我只得到3
为什么第一个结果不会产生负数? 我希望 -3 将符号扩展到 16 位,考虑到所有这些扩展位都是 1,它仍然应该给出一个二进制补码负数。因此,最高有效位也是 1。
看起来您的系统使用 32 位int
s 和负数的补码表示。
常量0xFFFF
覆盖最低有效两个字节,高两个字节为零。
-3
的值是0xFFFFFFFD
,所以用0x0000FFFF
屏蔽它你会得到0x0000FFFD
,或者十进制的65533
。
正3
是0x00000003
,所以用0x0000FFFF
屏蔽会给你3
回来。
如果您指定 16 位数据类型,您将得到您期望的结果,例如
int16_t x = -3;
x &= 0xffff;
cout << x;
在您的情况下 int 超过 2 个字节。 您可能在现代 CPU 上运行,现在通常整数是 4 字节(或 32 位)
如果您查看系统存储负数的方式,您会发现它是一个补数。 如果你只取最后 2 个字节,因为你的掩码是 0xFFFF,那么你只会得到它的一部分。
您的 2 个选择:
注意:我使用“通常”是因为 int 和 short 中的位数取决于您的 CPU 和编译器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.