当我给一个变量,例如值: e = 17|-15;
,我得到-15作为compiling.I后一个答案不能明白算术C ++使用。 它是如何进行逐位或运算负小数?
Answer 1:
它只是在做你的数字的二进制表示的操作。 在你的情况,这似乎是两个互补 。
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
Answer 2:
它或操作上的负数它这样做的正数一样。 这些数字几乎肯定代表了二进制补码形式,它给你这些值:
17 = 0000000000010001 -15 = 1111111111110001
正如你所看到的,17所有位在-15都已经确定,所以将它们结合起来的结果再次为-15。
Answer 3:
与负数的按位或工作就像按位或正数。 在一个数目的位进行或运算与其他数目的位。 你的处理器如何表示负数则另当别论。 大多数使用所谓的“补”,基本上是“颠倒的数量加1”。
所以,如果我们有,为了简单起见,8个数字:
15 is 00001111
Inverted we get 11110000
Add one 11110001
17 is 00010001
Ored together 11110001
Answer 4:
17 = b00010001
-15 = b11110001 <--- 2s complement
| -15 = b11110001
Answer 5:
运营商|
是一个“按位OR
”操作符,这意味着在目标的每一位被计算为OR
的两个操作数的相应位的结合- 。 这意味着,在结果的位为1
,如果在任何在相同位置的数目的两个比特的是1
,否则0
。
显然,结果取决于这又取决于平台上的数字的二进制表示。
几乎所有的平台都使用二进制补码 ,它可以被看作是无符号数的圈子,其中负数只是比正数向相反的方向和“环绕”的圈子。
无符号整数:
符号整数:
你的榜样的计算如下。
17: 00000000 00000000 00000000 00010001
-15: 11111111 11111111 11111111 11110001
------------------------------------------
-15: 11111111 11111111 11111111 11110001
Answer 6:
你必须着眼于位是如何工作的
基本上,如果任一号码有1
在一个特定的点,比结果也将有一个1
-15 : 11110001 (two's complement)
17 : 00010001
-15 | 17 : 11110001
正如你所看到的,结果是一样的-15
文章来源: How does C++ do bitwise “or” operations on negative numbers?