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

如何在GCC内联函数中获取128位有符号加法的溢出标志(OF)?

最优128位有符号整数加法带溢出标志(OF)实现方案

如果你需要把原有的无符号128位加法函数改成有符号版本并返回溢出标志(OF),同时要求内联、不使用汇编、兼容GCC 11+,那直接利用GCC原生支持的__int128类型和__builtin_add_overflow内置函数是最优解——没有之一。

最简高效实现

这个方案完全依赖编译器的原生支持,代码简洁到极致,还能让编译器生成最优化的机器指令:

/// Signed 128-bit integers addition with overflow indication.
static inline __int128 sbi_addo_i128(__int128 a, __int128 b, unsigned char *signed_OF) {
    __int128 retval;
    // __builtin_add_overflow返回1表示溢出(OF=1),0表示无溢出
    *signed_OF = __builtin_add_overflow(a, b, &retval);
    return retval;
}

为什么这是最优解?

  • 代码可读性拉满:不需要手动拆分128位整数的高低64位,逻辑一目了然,几乎不会出错。
  • 性能最优:GCC对__int128和__builtin_add_overflow有深度优化,会直接生成对应架构的高效指令(比如x86-64上会用ADCX/ADOX组合或者直接利用128位寄存器操作),比手动拆分高低位处理的代码效率更高。
  • 兼容性好:GCC 11+完全支持这个实现,Clang等兼容GCC的编译器也能无缝运行。

对比手动拆分的实现

之前你尝试的拆分高低位并结合__builtin_add_overflow、__builtin_sub_overflow的方案,虽然能实现功能,但存在明显缺点:

  • 代码逻辑复杂,需要手动处理低位进位对高位的影响,容易引入bug。
  • 编译器的优化空间有限,因为手动拆分打破了128位整数的整体语义,编译器无法进行全局优化。

所以,只要你的编译环境支持__int128(GCC 4.6+就开始支持,11+更是完全成熟),这个直接用__int128的实现就是首选。

内容的提问来源于stack exchange,提问作者Akon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:16:35