Python 打印(1>;>;(10^0xAAAA))为0。然而,它在c语言中是不同的
对于python:Python 打印(1>;>;(10^0xAAAA))为0。然而,它在c语言中是不同的,python,c,Python,C,对于python: print(1 >> (10 ^ 0xAAAA)) 结果是0 对于c语言: int main(int argc, const char * argv[]) { long int x=10; long int a = x ^ 0xAAAA; int b = 1 >> a; printf("a: %x\n", a); printf("b: %d\n", b); } 结果b=1 对于x=1100等。。python和c代码的输出都是0。
print(1 >> (10 ^ 0xAAAA))
结果是0
对于c语言:
int main(int argc, const char * argv[]) {
long int x=10;
long int a = x ^ 0xAAAA;
int b = 1 >> a;
printf("a: %x\n", a);
printf("b: %d\n", b);
}
结果b=1
对于x=1100等。。python和c代码的输出都是0。
如果x=10,则输出不同。
为什么?在Python中,您可以根据需要对shift进行任意右移,并且它将始终为您提供正确的结果(对于足够大的移位量,它将始终为零);在C语言中,大于类型大小的右移是未定义的行为(;左移也是如此),这意味着编译器可以自由地发出在特定情况下执行任何操作的代码
在所有位移位的“奇怪情况”中都有未定义的行为,其目的是让编译器将C代码中的移位直接转换为目标平台提供的移位指令,并获得最佳性能;在您的特定情况下,您可能正在x86上运行程序,其中C右移直接转换为a,因此它变成零位的右移,从而得到结果 因为两者都是不同的语言,并且支持不同的standard.c溢出,所以python不支持不同的语言可以做相同的事情,也可以做不同的事情。在C语言中,你正在将
1
移位更多sizeof(int)*CHAR\u BIT-1
(在大多数平台上转换为“大于31”)。这将导致AFAIK的未定义行为。编译器可能会将位数移位为模32,即(10^0xAAAA)%32
,等于0。因此,1您似乎认为所有语言在进行位运算时都必须忠实地遵循某种天命法则。事实并非如此。