6

当我给一个变量这样的值时:e = 17|-15;,编译后我得到-15作为答案。我不明白算术c++使用什么。它如何对负小数执行按位或运算?

4

6 回答 6

22

它只是对数字的二进制表示进行操作。在您的情况下,这似乎是二进制补码

 17 -> 00010001
-15 -> 11110001

如您所见,OR这两个数字的按位仍然是-15

在您上面的评论中,您表示您尝试过使用二进制补码表示,但您一定做错了什么。这是一步一步的:

 15 ->  00001111      // 15 decimal is 00001111 binary
-15 -> ~00001111 + 1  // negation in two's complement is equvalent to ~x + 1
-15 ->  11110000 + 1  // do the complement
-15 ->  11110001      // add the 1
于 2013-01-14T21:24:37.257 回答
6

它对负数执行 OR 操作的方式与对正数的操作相同。这些数字几乎可以肯定以二进制补码形式表示,它为您提供以下值:

17 = 0000000000010001
-15 = 1111111111110001

如您所见,17 的所有位都已设置为 -15,因此组合它们的结果再次为 -15。

于 2013-01-14T21:25:04.990 回答
3
   17 = b00010001
  -15 = b11110001 <--- 2s complement
| -15 = b11110001
于 2013-01-14T21:25:09.623 回答
3

按位或负数的工作方式与按位或正数一样。一个数字中的位与另一个数字中的位相或。您的处理器如何表示负数是另一回事。大多数使用称为“二进制补码”的东西,本质上是“反转数字并加 1”。

因此,为简单起见,如果我们有 8 位数字:

15 is            00001111
Inverted we get  11110000
Add one          11110001

17 is            00010001

Ored together    11110001
于 2013-01-14T21:26:54.943 回答
2

该运算符|是“按位OR”运算符,这意味着目标中的每个位都被计算为OR两个操作数中相应位的组合。这意味着,结果中的一个位是1如果相同位置的数字中的任何两个位是1,否则0

显然,结果取决于数字的二进制表示,而二进制表示又取决于平台。

几乎所有平台都使用二进制补码,可以将其视为一个无符号数字的圆圈,其中负数与正数的方向相反并“环绕”圆圈。

无符号整数:

在此处输入图像描述

有符号整数:

在此处输入图像描述

您的示例的计算如下。

 17:   00000000 00000000 00000000 00010001
-15:   11111111 11111111 11111111 11110001
------------------------------------------
-15:   11111111 11111111 11111111 11110001
于 2013-01-14T21:26:52.463 回答
1

你必须看看这些位是如何工作的

基本上,如果任一数字1在特定位置有一个,那么结果也将有一个1

-15       : 11110001 (two's complement)
17        : 00010001
-15 | 17  : 11110001

如您所见,结果与-15

于 2013-01-14T21:26:16.660 回答