如何计算输出?

时间:2010-11-24 15:30:22

标签: c

我在这个程序中对x = 320 ...

的值感到困惑
#include<stdio.h>
 int a=5;
int main(){
    int x;
    x=~a+a&a+a<<a;
    printf("%d",x);
    return 0;
}

http://codepad.org/UBgkwdYl

希望得到快速和积极的回应..

4 个答案:

答案 0 :(得分:8)

评估如下:

x = ((~a) + a) & ((a + a) << a);

您应该查看C运算符优先级表。

答案 1 :(得分:8)

实际上,如果你的实现对整数使用二进制补码编码,那么只会给你320。原因是因为它被解释为:

  (((~a) + a) & ((a + a) << a))
=      -1     &     (10   << 5)
=           10 << 5
=             320

二进制补码中的-1都是1位,所以当你and得到任何东西时,你得到相同的值。

然而,使用一个补码,~a + a将给出零,以便最终结果为零。

ISO C标准允许对有符号整数进行二次补码,一次补码和符号/幅度编码,这就是为什么这些代码本来就不好的原因之一。

答案 2 :(得分:1)

答案 3 :(得分:-1)

代码使用以下运算符(按等式中显示的顺序列出):

  • +
  • &安培;
  • &LT;&LT;

给定operator precedence table for the C languages,将按以下顺序评估运算符:

  • +
  • &LT;&LT;
  • &安培;

鉴于此,我们有以下步骤:

  1. 〜5。 5的逐位否定(二进制,为0000101)为250(二进制,为11111010)。
  2. ~5 + 5是250 + 5,或255。
  3. 5 + 5是10。
  4. 10&lt;&lt; 5是10的值(二进制,为00001010)左移五位,即320(二进制,为101000000)。
  5. 255(二进制,11111111)在布尔AND操作中加入320(二进制,为101000000),给出值320(二进制,为101000000)。
  6. 这给出了最终值320。