关于运营商“&”的问题

可能有错误的标题,但我不知道如何描述它。

int x=0x4a; h=!(0x80000000000&(0x39+(~x+1))); 

结果是h = 0。 问题是x有32位,而0x80000000000有32位以上。 如果我将变量i设置为0x80000000000并将其打印为hex格式,则它将显示0.因此,在这种情况下,为什么h的结果为1,因为0x80000000000变为0?

我用的语言是C.

0x8000000000是一个long long int常量。 因此,C编译器将算术表达式中的类型提升到表达式中出现的最高精度。

相反,你写道:

  int x=0x4a; int h1=(0x80000000000&(0x39+(~x+1))); int h = !h1; 

然后h将变为1.并且可能会发出关于缺失精度的警告。