如果数字不是> = 0,为什么代码添加7

Hug*_*ois 6 assembly mips

我在MIPS程序集中有这个程序,它来自一个C代码,它执行函数的eigth参数的简单平均值.

average8:
    addu $4,$4,$5
    addu $4,$4,$6
    addu $4,$4,$7
    lw $2,16($sp)
    #nop
    addu $4,$4,$2
    lw $2,20($sp)
    #nop
    addu $4,$4,$2
    lw $2,24($sp)
    #nop
    addu $4,$4,$2
    lw $2,28($sp)
    #nop
    addu $2,$4,$2
    bgez $2,$L2
    addu $2,$2,7
$L2:
    sra $2,$2,3
    j $31
Run Code Online (Sandbox Code Playgroud)

当数字是正数时,我们直接除以8(移位3位),但当数字为负时,我们首先addu 7进行除法.

我的问题是,为什么我们添加7$2何时$2 is not >= 0


编辑:这是C代码:

int average8(int x1, int x2, int x3, int x4, int x5, int x6, int x7, int x8)
{
    return (x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8) / 8;
}
Run Code Online (Sandbox Code Playgroud)

注意:在这种情况下,由于我们使用整数而不是浮点数或双精度数,因此除法可能会造成损失.

Owe*_*wen 10

差异似乎是在考虑负数的不同行为/ 8以及>> 3何时涉及负数:

int main() {
    printf("%d\n", (-50) / 8);
    printf("%d\n", (-50) >> 3);
    printf("%d\n", (-50 + 7) >> 3);
}
Run Code Online (Sandbox Code Playgroud)

-6
-7
-6
Run Code Online (Sandbox Code Playgroud)

因此,编译器想要使用>> 3优化,但它并不完全相同/ 8,因此它添加了一些代码来纠正它.