小编FPK*_*FPK的帖子

<long>/<long> 与 <int>/<int> 的区别

编译以下代码时:

int f(int i1,int i2)
{
    long l1=i1;
    long l2=i2;
    return l1*l2;
}
Run Code Online (Sandbox Code Playgroud)

clang 10.1forx86-64和 with -O3,我得到

    mov     eax, edi
    imul    eax, esi
    ret
Run Code Online (Sandbox Code Playgroud)

编译器认识到不需要完整的 64 位操作。

但是,当我用除法替换乘法时:

int f(int i1,int i2)
{
    long l1=i1;
    long l2=i2;
    return l1/l2;
}
Run Code Online (Sandbox Code Playgroud)

它编译成

    movsx   rax, edi
    movsx   rsi, esi
    cqo
    idiv    rsi
    ret
Run Code Online (Sandbox Code Playgroud)

所以它使用 64 位除法(与 gcc 相同)。

阻止在这里使用 32 位除法的反例是什么?

c compiler-construction optimization clang compiler-optimization

5
推荐指数
1
解决办法
79
查看次数