You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:45:03