我看到了关于在C中以单个操作获取商和余数的这个问题。然而,C的div
和ldiv
函数需要int
和long
参数。但是在C中如何执行无符号除法并保存余数和商?据我所知,div
或ldiv
没有unsigned
版本。我必须使用内联汇编吗?
我看到了关于在C中以单个操作获取商和余数的这个问题。然而,C的div
和ldiv
函数需要int
和long
参数。但是在C中如何执行无符号除法并保存余数和商?据我所知,div
或ldiv
没有unsigned
版本。我必须使用内联汇编吗?
只需将%
和/
放得足够接近,让任何合理的现代优化编译器将它们转换为单个指令。
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
div
和mod
的上下文编译成单个指令调用。 - Rogue