我必须在这里绝对疯狂,但我的机器上的gcc 4.7.3
给出了最荒谬的结果。下面是我测试的确切代码:算术右移给假结果?
#include <iostream>
using namespace std;
int main(){
unsigned int b = 100000;
cout << (b>>b) << endl;
b = b >> b;
cout << b << endl;
b >>= b;
cout << b << endl;
return 0;
}
现在,应该产生这是正确的本身转移任意数量的(n/(2^n) == 0
与整数除法,n>1
和正/无符号) ,但不知何故这里是我的输出:
100000
100000
100000
我疯了吗?可能会发生什么?
@ShafikYaghmour:假设编译器甚至不愿意提出指示。完全拒绝这个计划是正确的。 – MSalters
@ MSalters确实,我们正在进入编译器/平台/版本特定在这一点上,但对于目前和最近的版本,这是这种情况,因为我已经表明它是未定义的,所以你是明确的你自己,'gcc'似乎只当使用'-O0'时产生'shr'。 –
@ShafikYaghmour:英特尔只是gcc支持的众多平台之一,它们有不同的优化阶段。优化中的一个常见技巧是说“这个值只能在0到31之间,因为它用于移位,如果我遵循代码路径X来到这里,值不会介于0和31之间,所以代码路径X是不可能的我甚至不需要为它生成指令“。 GCC着名的做空指针检查。 – MSalters