是否可以在 C++ 中的单个操作中同时获得除法的模数和商数?

mcz*_*nek 6 c++ assembly integer-division modulus

我听说当处理器执行 / 或 % 时,它将执行相同的操作,但以一种方式返回商,另一种方式返回余数。

是否可以在一次操作中同时获得两者?也许如果我加入一段汇编代码(我从未做过)?

prl*_*prl 9

是的,编译器会为你做这件事。只需使用除法后跟具有相同操作数的余数。
https://godbolt.org/z/oK4f4s

void div(int n, int d, int *q, int *r)
{
    *q = n / d;
    *r = n % d;
}

div(int, int, int*, int*):
        mov     eax, edi
        mov     r8, rdx
        cdq
        idiv    esi
        mov     DWORD PTR [r8], eax
        mov     DWORD PTR [rcx], edx
        ret
Run Code Online (Sandbox Code Playgroud)


eer*_*ika 8

是否可以在一次操作中同时获得两者?

不,C++ 中没有这样的运算符。标准库中有一个函数可以执行这两种操作:std::div

但这没关系。在 C++ 中有一个或两个操作并不意味着 cpu 必须执行那么多操作。一个不错的优化器将能够将两个操作转换为一条指令(假设目标 CPU 可以实现)。

  • (或者,如果不是单个指令,则计算商、被除数和除数的余数,而不重做任何不必要的工作。例如,ARM 有一个乘法和减法指令,设计用于计算除法后的余数。) (2认同)