C语言中能否一次性获取unsigned无符号数的商和余数
无符号除法同时获取商和余数的实现方案
结论
不需要使用内联汇编实现,常规写法即可获得和单次运算一致的性能。
通用标准C实现
直接通过除法运算符/和取余运算符%分别计算商和余数即可,当前主流编译器(GCC、Clang、MSVC等)在开启O1及以上优化等级时,都会自动将同组无符号除法、取余操作合并为单次除法指令,不会执行两次除法运算。
示例代码如下:
#include <stdint.h> // 32位无符号除法结果结构体 typedef struct { uint32_t quot; // 商 uint32_t rem; // 余数 } udiv32_res_t; udiv32_res_t udiv32(uint32_t dividend, uint32_t divisor) { udiv32_res_t res; // 两行代码会被编译器优化为单次除法运算 res.quot = dividend / divisor; res.rem = dividend % divisor; return res; }
如果需要适配64位无符号数,只需要将结构体中的类型替换为uint64_t即可。
编译器内置函数方案
如果希望明确指定单次除法逻辑,不依赖编译器优化行为,可以使用对应编译器的内置函数:
- GCC/Clang 可使用内置函数
__builtin_udivmodsi4(32位)、__builtin_udivmoddi4(64位),示例:// 32位无符号除法 uint32_t quot, rem; quot = __builtin_udivmodsi4(dividend, divisor, &rem); - MSVC 可使用内置函数
_udiv32、_udiv64,直接返回商,余数通过指针参数输出。
注意事项
- 和标准
div系列函数一致,你需要自行保证除数不为0,否则会触发未定义行为。 - 手写内联汇编会导致代码和CPU架构绑定,无法跨平台编译,且通常不会比编译器优化后的生成代码性能更高,因此不推荐使用。
内容的提问来源于stack exchange,提问作者CPlus
相关产品推荐
相关产品推荐

