2014-09-03 43 views
2

我正在處理的一些代碼讓我難堪。我似乎正在處理整數溢出,我承認我以前沒有遇到過,但我已經嘗試了幾件事情來解決它,並沒有一個工作到目前爲止。我使用的是MSVC++ 2010儘管類型足夠大,整數溢出?

相關的代碼非常簡單,如下:

int64_t numerator = cdfVal * (maxIntensity - 1); 

這種失敗對我來說,其中cdfVal(這僅僅是從一個數組中讀取值的情況下,沒什麼特別)是8667003,maxIntensity - 1是255.一個簡單的計算表明解決方案應該是2210085765,而我得到的值是-2084881531。我知道這是一個整數溢出的情況,但我認爲64位將足夠大來保存結果。我切換到uint64_t,但在那種情況下,我得到了一個長度爲20位的結果,這顯然是不正確的! 我試過使用Boost的multiprecision整數,但也得到了類似的結果。

我覺得這是一件非常簡單的事情,我很想念。

+3

什麼類型'cdfVal'和'maxIntensity'是誰? – 2014-09-03 18:18:58

+0

兩者都只是普通的'int's。 – CommanderDJ 2014-09-03 18:20:16

+6

'int' *'int' ='int' – 2014-09-03 18:21:31

回答

3

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);