我正在努力的一些代码让我很难过。我似乎正在处理整数溢出,我承认以前我没有遇到过,但我已经尝试了几个方法来修复它,但到目前为止它们都没有。我正在使用MSVC ++ 2010。
相关代码非常简单,如下:
int64_t numerator = cdfVal * (maxIntensity - 1);
对于cdfVal(这只是从数组读取的值,没什么花哨的)是8667003和maxIntensity - 1是255的情况,这对我来说是失败的。一个简单的计算显示解决方案应该是2210085765,而我和#39;得到值-2084881531。我知道这是整数溢出的情况,但我认为64位足够大以保持结果。我切换到uint64_t,但是在那种情况下我得到了一个长二十位的结果,这显然是不正确的! 我尝试过使用Boost的多精度整数,但也得到了类似的结果。
我觉得这很简单,我很遗憾。
答案 0 :(得分:3)
numerator
的类型与计算表达式的类型无关。 C ++在“最大类型的操作数”中评估表达式(忽略一些细节)。
您提到的cdfVal
和maxIntensity
都属于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);