繁体   English   中英

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

[英]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

30x00000003 ,所以用0x0000FFFF屏蔽会给你3回来。

如果您指定 16 位数据类型,您将得到您期望的结果,例如

int16_t x = -3;
x &= 0xffff;
cout << x;

在您的情况下 int 超过 2 个字节。 您可能在现代 CPU 上运行,现在通常整数是 4 字节(或 32 位)

如果您查看系统存储负数的方式,您会发现它是一个补数。 如果你只取最后 2 个字节,因为你的掩码是 0xFFFF,那么你只会得到它的一部分。

您的 2 个选择:

  1. 使用 short 而不是 int。 通常它是整数的一半,只有 2 位
  2. 使用更大的掩码,如 0xFFFFFFFF,它涵盖了整数的所有位

注意:我使用“通常”是因为 int 和 short 中的位数取决于您的 CPU 和编译器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM