运算符是否按位工作?

时间:2019-04-15 15:05:47

标签: c

#include<stdio.h>
void main()
{
  int a, b, c;
  a=5;
  b=8;
  c= ~(a|b);
  printf("%d",c);
} 

预期的输出为-13,但结果显示为-14- 14怎么样?

5 个答案:

答案 0 :(得分:2)

因为您有一台2的补码计算机。

  • 5 | 8给出二进制0101 | 1000 = 1101 = 12月13日。
  • 使用~将其反转,您将得到1111....0010
  • 将其表示为带符号类型,然后以1的补码形式应为-13 dec。
  • 但是对于2的补码,我们减去1并得到-14 dec。

由于与~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)

假设您使用8位整数:

  • a=5表示为00000101
  • b=8表示为00001000
  • a|b00001101

反转位时,它将为11110010,在Two's complement中为-14

答案 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

相关问题