int x = 1; //int为32位 int a = 1 << 32; //00000000 int b = x << 32; //00000001 为什么这两种方式结果会不同? 看起来是 第3行对32取了模 但第2行没有 第2行的1默认不就是int类型吗
这里有个类似的问题(动动手指就能搜到的好么)。 C 层面的解释是:未定义行为,怪异点是正常的。 CPU 层面的解释是:Intel CPU 把左移位数的操作数只取了五位。但为什么结果不同,你还是自己去看 StackOverflow 那个回答吧。 PS: 这个程序开优化之后结果是一致的,也就是说未优化时,部分结果是编译期计算的,部分结果是交给 CPU 在运行时计算的,所以有差别。
这里有个类似的问题(动动手指就能搜到的好么)。
C 层面的解释是:未定义行为,怪异点是正常的。
CPU 层面的解释是:Intel CPU 把左移位数的操作数只取了五位。但为什么结果不同,你还是自己去看 StackOverflow 那个回答吧。
PS: 这个程序开优化之后结果是一致的,也就是说未优化时,部分结果是编译期计算的,部分结果是交给 CPU 在运行时计算的,所以有差别。