簡體   English   中英

為什么Int32.MaxValue * Int32.MaxValue == 1?

[英]Why does Int32.MaxValue * Int32.MaxValue == 1?

我知道, Int32.MaxValue * Int32.MaxValue將產生一個大於Int32的數字; 但是,這句話不應該提出某種例外嗎?

當我做一些像IF (X * Y > Z)這樣的東西都是Int32時候我碰到了這個。 XY足夠大,你從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.

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