对于 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=1,100等。python和c代码的输出都是0。 给定 x=10,输出不同。 为什么?
最佳答案
在 Python 中,您可以向右移动任意多的位置,它始终会为您提供正确的结果(对于足够大的移动量,结果将始终为零);在 C 中,超过类型大小的右移是未定义的行为( C99, §6.5.7 ¶3 ;左移也是如此),这意味着编译器可以自由地发出在特定情况下执行任何操作的代码。
在所有移位的“奇怪情况”中具有未定义行为的要点是让编译器将 C 代码中的移位直接翻译为目标平台提供的任何移位指令,并获得最佳性能;在您的特定情况下,您可能正在 x86 上运行程序,其中 C 右移直接转换为 SHR or SAR instruction. These take only the low 5 bits of the shift amount ,所以它变成了零位的右移,因此是结果。
关于python - print(1 >> (10 ^ 0xAAAA)) 是0。但是在c语言中是不一样的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42061228/