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

Gre*_*icz 5 c# math int

我知道,Int32.MaxValue * Int32.MaxValue会产生一个大于的数字Int32; 但是,这句话不应该提出某种例外吗?

在做IF (X * Y > Z)所有事情的时候,我碰到了这个Int32.X并且Y足够大,你会得到一个虚假的价值X * Y.

为什么这样以及如何解决这个问题?除了把一切都投到了Int64.

Dan*_*ath 26

因为int32将结果限制在32位.

所以,如果你看一下字节级的数学.

FFFFFFFF * FFFFFFFF = FFFFFFFE00000001
Run Code Online (Sandbox Code Playgroud)

如您所见,最低的4个字节= 1.


Bry*_*tts 19

默认情况下,C#算法在未经检查的上下文中完成,这意味着值将翻转.

您可以使用选中和未选中的关键字来控制该行为.


BCS*_*BCS 8

有趣的是,无论您使用何种基础,这都有效:

(n-1)*(n-1)  mod n 
n^2 - 2n + 1 mod n
0   -  0 + 1 mod n
           1 mod n
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 6

你必须要求它:

checked {
    int a = int.MaxValue;
    int b = int.MaxValue;
    int c = a * b;    // kaboom
}
Run Code Online (Sandbox Code Playgroud)


mun*_*sor 6

您已禁用项目中的溢出检查.使用选中模式On会抛出异常.