对于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,输出是不同的。 为什么呢?
答案 0 :(得分:7)
在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,因此它成为零位的右移,因此结果。