繁体   English   中英

当按位 AND 应用于负数时会发生什么?

[英]What happens when bitwise AND is applied to negative numbers?

我编写并编译了以下代码:

void main()
{ 
    printf("%d", -10 & 5);
}

在 C 中,在二进制&的结果中,每一位都取决于操作数中的两个相应位。 如果在两个操作数中相同位置的位都设置为 (1),则在结果中设置它。 如果任一操作数中的清零 (0),则结果中的清零。 例如,给定位 0011 和 0101, &运算符将产生 0001,因为只有在最后一个位置是两个操作数中设置的位。

您可能已经知道正整数用二进制表示。 位位置从“右侧”的 0 开始编号,然后是下一个位置的 1、2、3,依此类推。 位置i 中的位代表 2 i的值,因此位 0 代表 1,位 1 代表 2,位 2 代表 4,位 3 代表 8,位 4 代表 16,依此类推。 所有位表示的值是设置为 1 的位值的总和。因此 101 表示 5,因为设置了 2 2 = 4 和 2 0 = 1 的位,并且 4+1 = 5。

C 标准指定了 C 实现可以用来表示负数的三个规则(在 C 2018 6.2.6.2 2 中):

  • 其中一位代表一个符号。 如果符号位为 0,则值与上述相同。 如果符号位为 1,则该值取反。 因此,如果第一位是符号位,则 5 是 0101 是 5,-5 是 1101。这称为符号和幅度
  • 其中一位代表符号,如果数字为负,则所有位都被反转。 所以 5 是 0101,-5 是 1010。这被称为一个补码
  • 其中一位代表一个符号,如果数字为负(我们称之为x ),则这些位将设置为用于 2 Nx 的模式,其中N是位数。 例如,对于四位,2 N = 16,5 为 0101,-5 用 16-5 = 11 的位表示,即 1011。这称为二进制补码

在早期的计算机硬件和软件中,上述所有方法都尝试过。 最后一个,二进制补码,在现代整数计算中占据压倒性优势。 (大多数浮点数使用符号和大小。)尽管如此,C 标准仍然允许实现使用任何方法。

因此, -10 & 5的结果取决于实现。 我将使用八位进行说明,并用空格将它们分成两组,每组四位以提高可见性:

用二进制补码:

  • −10 用 1111 0110 表示(256 − 10 = 246 = 128+64+32+16+4+2),5 用 0000 0101, −10 & 5 0000 0100,表示 4。

补语:

  • -10用1111 0101表示,5用0000 0101表示, −10 & 5 0000 0101表示5。

带符号和大小:

  • -10用1000 1010表示,5用0000 0101表示, -10 & 5 0000 0000表示,表示0。

因此,符合 C 标准的 C 实现可以为-10 & 5生成 0、4 或-10 & 5 ,但 4 是迄今为止最常见的结果。

暂无
暂无

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

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