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

编译以下代码时:

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位除法的反例是什么?

评论