#include<stdio.h>
void main()
{
int a, b, c;
a=5;
b=8;
c= ~(a|b);
printf("%d",c);
}
预期的输出为-13
,但结果显示为-14
。 - 14
怎么样?
答案 0 :(得分:2)
因为您有一台2的补码计算机。
0101 | 1000 = 1101
= 12月13日。 ~
将其反转,您将得到1111....0010
。 由于与~0
给出2的补码-1
而不是-0
相同的原因。
答案 1 :(得分:0)
您将补语混淆为一个(〜),并将补语混淆为两个/一元运算符-
~(5|8)
是-(5|8) - 1
,所以-13 - 1
是-14
答案 2 :(得分:0)
这是由于负数的二进制补码表示。二进制补码是通过将所有位取反然后加一个来完成的。
首先,您有a|b
(为简单起见,我仅显示低阶8位):
a 00000101 5
| b 00001000 8
------------
00001101 13
然后按位非:
~ 00001101 13
----------
11110010 -14
对正值执行按位NOT不会给您负值,而是给您一个 less 。
答案 3 :(得分:0)
答案 4 :(得分:0)
这是因为2的补码。
使用8位带符号的值(与32位带符号的功能相同,但这更易于演示):
8: 00001000
5: 00000101
8 | 5: 00001101
~(8 | 5): 11110010 = 242 (unsigned)
当MSb较高时,做2的补数的快速方法是减去2 ^ n(这里n是8,2 ^ 8是256)
242-256 = -14