C# int中的模与溢出给出了不同的结果

C# int中的模与溢出给出了不同的结果,c#,C#,我在做第15天的训练,作为其中的一部分,我得到了一个意想不到的结果。我必须基本上计算16807*16807*65,这个值不应该大于int.maxValue。我注意到我的结果与预期结果不匹配,所以当我对其进行简化时,基本上可以归结为以下几点(未使用取消选中,只是为了满足编译器的要求): 可能有一些明显的我遗漏了。int.MaxValue+1,当转换为整数(在未选中的上下文中)时为int.MinValue(-2147483648)(int.MaxValue+1L)%int.MaxValue为1。是的

我在做第15天的训练,作为其中的一部分,我得到了一个意想不到的结果。我必须基本上计算16807*16807*65,这个值不应该大于int.maxValue。我注意到我的结果与预期结果不匹配,所以当我对其进行简化时,基本上可以归结为以下几点(未使用取消选中,只是为了满足编译器的要求):


可能有一些明显的我遗漏了。

int.MaxValue+1
,当转换为整数(在未选中的上下文中)时为
int.MinValue
(-2147483648)<代码>(int.MaxValue+1L)%int.MaxValue为
1
。是的,它们都是不同的,因为它们都被定义为做不同的事情。

int.MaxValue+1
,当转换为整数(在未选中的上下文中)时是
int.MinValue
(-2147483648)<代码>(int.MaxValue+1L)%int.MaxValue为
1
。是的,它们都是不同的,因为它们都被定义为做不同的事情。

“16807*16807*65,值不应该大于int.maxValue”,但是……它是。是18360891185。int.maxvalue是2147483647。您需要标记为未选中的事实正是因为编译器告诉您它大于最大值。我可能是错的,但不是
未选中的
只是在有效值的开头换行(
int.MinValue
)?当然,这和模有不同的结果。令人惊讶的是,这两个值非常接近。好了,伙计们,现在我明白了。它不工作,因为它不会溢出到0,但会溢出到-int.MinValue。有时候在发布之前我需要想得更久一点。@krillgar为什么他们很接近让人惊讶?当将
someLong%int.MaxValue
与在未检查的上下文中无限递增一个整数进行比较时,第二个整数在循环之前的值几乎是原来的两倍(事实上,比一半少2个),因此当你开始循环时,它们几乎在一半时间内处于相位。@krillgar每次循环(~40亿)你两点前下车。这里的数字约为180亿;它大约运行了4次,4*2=8,所以它们被8关闭。“16807*16807*65,值不应该大于int.maxValue”,但是……它是。是18360891185。int.maxvalue是2147483647。您需要标记为未选中的事实正是因为编译器告诉您它大于最大值。我可能是错的,但不是
未选中的
只是在有效值的开头换行(
int.MinValue
)?当然,这和模有不同的结果。令人惊讶的是,这两个值非常接近。好了,伙计们,现在我明白了。它不工作,因为它不会溢出到0,但会溢出到-int.MinValue。有时候在发布之前我需要想得更久一点。@krillgar为什么他们很接近让人惊讶?当将
someLong%int.MaxValue
与在未检查的上下文中无限递增一个整数进行比较时,第二个整数在循环之前的值几乎是原来的两倍(事实上,比一半少2个),因此当你开始循环时,它们几乎在一半时间内处于相位。@krillgar每次循环(~40亿)你两点前下车。这里的数字约为180亿;它大约运行了4次,4*2=8,所以它们以8的速度关闭。
 int a = unchecked(16807 * 16807 * 65); //1181022001
 long b = 16807L * 16807 * 65 % int.MaxValue; //1181022009