在C语言中是否可以同时获取无符号商和余数?

3

我看到了关于在C中以单个操作获取商和余数的这个问题。然而,C的divldiv函数需要intlong参数。但是在C中如何执行无符号除法并保存余数和商?据我所知,divldiv没有unsigned版本。我必须使用内联汇编吗?


我相信GCC提供了一个优化标志,可以自动将使用divmod的上下文编译成单个指令调用。 - Rogue
我认为您不应该尝试在这个层面上寻找代码优化的方法。如果您像这样以明显的方式编写操作,如“quotient = a / b; remainder = a%b;”,并在编译器中启用优化,那么您可以假设编译器将为您的目标处理器生成最优代码。如果您真的发现编译器的优化不足,您可以使用汇编代码。 - Bodo
1个回答

3

只需将%/放得足够接近,让任何合理的现代优化编译器将它们转换为单个指令。

Godbolt示例

struct res { 
    unsigned long long quo;
    unsigned long long rem;
} 
f(unsigned long long x, unsigned long long y) {
    struct res r;
    r.quo = x / y;
    r.rem = x % y;
    return r;
}

使用 GCC 11.2 -O2 编译生成:

f:
        mov     rax, rdi
        xor     edx, edx
        div     rsi
        ret

4
在过去的几年里可能有所改变,但据我的经验,在过去十年中这种方法并没有始终奏效。 "不合理"的编译器仍然存在,通过在Compiler Explorer上快速切换到针对ARM7的Clang [显示](https://gcc.godbolt.org/z/9bjTWhMTs)。我看到了对`__eabi_uldivmod`的调用,但只使用了商,而模数则通过反向乘法计算。 - njuffa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接