python - print(1 >> (10 ^ 0xAAAA)) 是0。但是在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=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/

相关文章:

python - 出现错误 OpenCV(3.4.1) C :\projects\opencv-python\opencv\modules\imgproc\src\thresh. cpp:1406: error: (-215)

python - Python 中的嵌套 'any' 和 'all' 条件

python - 需要建议 - Python 中的网络 - 一个好主意?

c - 无法找到二次方程代码中的错误

c - 如何将返回的WndProc/DlgProc句柄转换为函数地址?

c - 这个多空指针函数是如何工作的?

python - ValueError : features should be a dictionary of `Tensor` s. 给定类型:<class 'NoneType' >

Python 子进程 readline() 挂起;不能使用普通选项

c - 删除 Kernighan 和 Ritchie 的评论程序

c++ - 调试时找不到 "arm-elf-g++"