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

消除C++20常量表达式中带符号整数溢出的未定义行为

问题:C++20 constexpr中带符号整数溢出的合规解决方法?

我正在使用C++20移植一个依赖Java和C#中带符号整数溢出特性的库,同时需要在编译时生成并提供该库所需的表。但我的代码出现了溢出报错,以下是复现该错误的最简示例(解决此示例的方案也能解决我的实际问题):

#include <iostream> 

constexpr auto foo(){
    std::int64_t a = 2; 
    std::int64_t very_large_constant = 0x598CD327003817B5L; 
    std::int64_t x = a * very_large_constant; 
    return x; 
}
 
int main(){
    std::cout << foo() << std::endl; 
    return 0; 
}

负溢出版本示例:

#include <iostream> 

constexpr auto foo(){
    std::int64_t a = -2; 
    std::int64_t very_large_constant = 0x598CD327003817B5L; 
    std::int64_t x = a * very_large_constant; 
    return x; 
}
 
int main(){
    std::cout << foo() << std::endl; 
    return 0; 
}

编译报错信息分别为:

  • "12905529061151879018超出long long可表示范围"
  • "-12905529061151879018超出long long可表示范围"

我清楚带符号整数溢出在C++中属于未定义行为,也了解GCC和MSVC不会对此报错,且可以通过添加编译标志让Clang忽略此问题,但我不想切换编译器或使用忽略无效constexpr的标志。请问该如何真正解决此问题?是否有方法可以明确定义我期望的(类似Java/C#的)溢出行为?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:48:22