簡體   English   中英

將兩個正整數Int32相乘會返回錯誤的負答案?

[英]Multiplying two positive Int32 returns incorrect, negative answer?

我真的很為難。 我使用Windows Phone 7.5的C#進行編碼; 我正在從文本框中獲取文本,將其解析為數組,然后使用Convert.ToInt32將每個數組元素轉換為Int32,然后通過一系列數學計算運行所得的Int32值,並將Int32值相乘並將其添加到硬編碼數字中(全部取決於在UI中選擇的內容)。

一切順利,直到我將所得的計算結果乘以它們:我將兩個正數相乘得到一個負數! 這是我唯一一次使用源自使用Convert.ToInt32函數的方法的兩個數字進行任何計算的情況。 將它們相加,相減甚至相除后,數學計算就正確了。 但是當它們相乘時,就沒有骰子。 數學是完全錯誤的。 我仔細檢查了LibreOffice Calc中的數學,但不匹配。 單步執行代碼時,直到將使用Convert.ToInt32函數的方法中起源的數字相乘在一起,一切都是正確的。 有任何想法嗎?

這些數字可能足夠大, Int32.MaxValue溢出Int32.MaxValue

考慮:

var r = Int32.MaxValue / 2;     // r = 1073741823
var ans = r * 3;                // ans = -1073741827

原因是負整數在最大位用1表示,因此任何大於最大值的乘法在該位置都將有1 ,這被解釋為負值。

所有整數類型( intshortbytesbytecharlongulongushortuint )都有溢出的危險。 您可以使用浮點類型,例如floatdouble ,但這會帶來其他問題,例如舍入和相等問題。 您必須知道期望使用哪種數字,然后才能使用其他類型,例如longuintulong或浮點類型(例如doubledecimal 最終,如果您不知道會發生什么,則需要在輸入上編寫保護代碼(例如,將其包裝在checked { }塊中[感謝@EricLippert] ,並在該值超出范圍時進行處理。您設計的。

編輯:.Net 4.0+中的另一個選項是使用System.Numerics.BigInteger ,它避免了任何溢出,但速度可能很慢。

快速而骯臟的解決方案是將值之一轉換為long ,然后將結果轉換回int (如果可能)。

編輯:在這種情況下,無需使用BigInteger ,因為int x int永遠不會long溢出。

它可能是整數溢出異常。 即使您將數字存儲在足夠大的變量中,也會發生這種情況。 示例(長,雙等)

int one = int.MaxValue;
int two = int.MaxValue;

long sum = (long)(one + two); //Returns -2, because the cast was after the sum
                             //(long) -2.

您可以將它們強制轉換為總和,以獲得正確的結果

int one = int.MaxValue;
int two = int.MaxValue;

long sum = (long) one + (long)two; //Returns 4294967294, it casts both the 
                                   //integer to long and then adds them 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM