编译以下代码时:
int f(int i1,int i2) { long l1=i1; long l2=i2; return l1*l2; }
对于x86-64使用clang 10.1,使用-O3,我得到
mov eax, edi imul eax, esi ret
编译器认识到,不需要完整的64位操作。
但是,当我用除法代替乘法:
int f(int i1,int i2) { long l1=i1; long l2=i2; return l1/l2; }
它编译成
movsx rax, edi movsx rsi, esi cqo idiv rsi ret
因此,它使用64位除法(与gcc相同)。
在这里阻止使用32位除法的反例是什么?
编译以下代码时:int f(int i1,int i2){long l1 = i1;长l2 = i2;返回l1 * l2; }在x86-64上使用clang 10.1,在-O3下,我得到mov eax,edi imul eax,...
考虑i1 == INT_MIN == -2147483648
和i2 == -1
时会发生什么。