![](/img/trans.png)
[英]C# GetHashCode with two Int16, also returns only up to 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
,這被解釋為負值。
所有整數類型( int
, short
, byte
, sbyte
, char
, long
, ulong
, ushort
和uint
)都有溢出的危險。 您可以使用浮點類型,例如float
或double
,但這會帶來其他問題,例如舍入和相等問題。 您必須知道期望使用哪種數字,然后才能使用其他類型,例如long
, uint
, ulong
或浮點類型(例如double
或decimal
。 最終,如果您不知道會發生什么,則需要在輸入上編寫保護代碼(例如,將其包裝在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.