gpt4 book ai didi

c++ - 尽管类型足够大但整数溢出?

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:11 24 4
gpt4 key购买 nike

我正在处理的一些代码让我很困惑。我似乎在处理整数溢出,我承认我以前没有遇到过,但我已经尝试了几种方法来修复它,但到目前为止它们都没有奏效。我正在使用 MSVC++ 2010。

相关代码很简单,如下:

int64_t numerator = cdfVal * (maxIntensity - 1);

对于 cdfVal(这只是从数组中读取的一个值,没什么特别的)是 8667003 而 maxIntensity - 1 是 255 的情况,这对我来说是失败的。一个简单的计算表明解决方案应该是 2210085765,而我正在获取值 -2084881531。我知道这是整数溢出的情况,但我认为 64 位足以容纳结果。我切换到 uint64_t,但在那种情况下,我得到的结果是 20 位长,这显然是不正确的!我试过使用 Boost 的多精度整数,但也得到了类似的结果。

我觉得这是我所缺少的非常简单的东西。

最佳答案

numerator 的类型与计算表达式的类型无关。 C++ 计算“涉及的操作数的最大类型”中的表达式(忽略一些细节)。

您提到 cdfValmaxIntensity 都是 int 类型。 1 也是 int 类型。这意味着整个表达式以 int 类型求值(并在那里溢出)。生成的 int 然后被提升为 int64_t 并分配给 numerator

如果您想解决这个问题,请将至少一个变量声明为 int64_t,或者至少将其中一个变量转换为所需的类型。像这样:

int64_t numerator = static_cast<int64_t>(cdfVal) * (maxIntensity - 1);

为了保持一致和更明确一点,您当然可以同时转换:

int64_t numerator = static_cast<int64_t>(cdfVal) * static_cast<int64_t>(maxIntensity - 1);

关于c++ - 尽管类型足够大但整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25651032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com