[英]Why does Int32.MaxValue * Int32.MaxValue == 1?
我知道, Int32.MaxValue * Int32.MaxValue
將產生一個大於Int32
的數字; 但是,這句話不應該提出某種例外嗎?
當我做一些像IF (X * Y > Z)
這樣的東西都是Int32
時候我碰到了這個。 X
和Y
足夠大,你從X * Y
得到一個虛假的值。
為什么這樣以及如何解決這個問題? 除了將所有內容都轉換為Int64
。
因為int32將結果限制在32位。
所以,如果你看一下字節級的數學。
FFFFFFFF * FFFFFFFF = FFFFFFFE00000001
如您所見,最低的4個字節= 1。
默認情況下,C#算法在未經檢查的上下文中完成,這意味着值將翻轉。
您可以使用選中和未選中的關鍵字來控制該行為。
有趣的是,無論您使用何種基礎,這都有效:
(n-1)*(n-1) mod n
n^2 - 2n + 1 mod n
0 - 0 + 1 mod n
1 mod n
你必須要求它:
checked {
int a = int.MaxValue;
int b = int.MaxValue;
int c = a * b; // kaboom
}
您已禁用項目中的溢出檢查。 使用選中模式On會拋出異常。
Int32.MaxValue(使用此處給出的值)為2,147,483,647。
在基數2中,即: 111 1111 1111 1111 1111 1111 1111 1111
... 2 ^ 31-1。 第一位是符號位。
如果你自己乘以它,你會得到: 11 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0001
回到“為什么它是1?”的原始問題,因為Integer.MaxValue是最大值,導致整數溢出。 結果被截斷為最低31位,即0加1。
編輯:這是關於二進制乘法的教程 。 使用所有1的簡單案例:111 * 111
你得到:00111 01110 + 11100 = 100001
您可以針對Int32.MaxValue的情況展開它。 為簡潔起見,我將其縮短為3位數。
另外,正如另一個答案所說,在C#中,這些溢出將默認發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.