【问题标题】:Why does int.MinValue % -1 cause and OverflowException [duplicate]为什么 int.MinValue % -1 会导致和 OverflowException [重复]
【发布时间】:2015-11-25 23:12:24
【问题描述】:

在 7.8.3 中。关于余数运算符的 C# 规范中声明如下:

如果左边的操作数是最小的 int 或 long 值,而右边的 操作数为 -1,抛出 System.OverflowException。

因此int.MinValue % -1 将导致溢出异常。我想知道为什么?

【问题讨论】:

  • 请注意,在 Java 中,根据规范,结果是 0,而在 C 中,该操作调用未定义的行为。

标签: c# modulus overflowexception


【解决方案1】:

在二进制补码算术中,数据类型的范围从 (-2**n) 到 (2**n - 1)(其中 'n' 比数据类型中的位数少 1)。

例如,16 位有符号整数的有效范围为 -32768 (-2**15) 到 32767 (2**15 - 1)。

-32768 / -1 = +32768 这超出了 16 位有符号整数的有效范围。

【讨论】:

  • 数学上 int.MinValue % -1 将是 0 或 -1(或可能为 1)。这不超过 16 位有符号整数的有效范围。
  • 但它通常是通过先除然后求余数来计算的。
  • 同意,但是语言规范是否需要这个顺序?
  • 我不知道。我有点惊讶 C# 不能正确处理它。
猜你喜欢
  • 2014-12-23
  • 2014-11-29
  • 2017-02-15
  • 2021-09-10
  • 2016-07-29
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2016-09-24
相关资源
最近更新 更多