如何计算输出?

mr_*_*air 1 c

我在这个程序中很困惑x = 320的值...

#include<stdio.h>
 int a=5;
int main(){
    int x;
    x=~a+a&a+a<<a;
    printf("%d",x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://codepad.org/UBgkwdYl

希望快速积极的回应..

rob*_*rit 8

这个评估如下:

x = ((~a) + a) & ((a + a) << a);
Run Code Online (Sandbox Code Playgroud)

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


pax*_*blo 8

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

  (((~a) + a) & ((a + a) << a))
=      -1     &     (10   << 5)
=           10 << 5
=             320
Run Code Online (Sandbox Code Playgroud)

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

但是,使用一个补码,~a + a将给出零,以便最终结果为零.

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