【问题标题】:-1 * int.MinValue gives an error-1 * int.MinValue 给出错误
【发布时间】:2011-11-24 11:34:19
【问题描述】:

当我写这段代码时

Console.WriteLine(-1 * int.MinValue);

int a = -1 * -2147483648;

我收到一个错误

在检查模式下编译时操作溢出。

是否有专门针对这个值的编译时检查? 还是实时计算所有书面表达?

【问题讨论】:

  • int.MinValue 不是-21474048,是-2147483648
  • @BoltClock 来自内存,是吗?
  • 我犯了一个错误,但没关系

标签: c# .net int


【解决方案1】:

编译器能够在编译时而不是运行时执行(乘法)计算,确实如此。

由于 -1 * int.MinValue (-1 * -2,147,483,648, 因此 2,147,483,648) 大于 int.MaxValue (2,147,483,647),因此会出现编译错误。

为了证明你的确切陈述不是特殊的,请尝试:

Console.WriteLine(-2 * 1073741826);

你会得到同样的行为。

【讨论】:

  • 是实时统计所有书面表达吗?
  • 如果“计数”是指“计算”,如果“实时”是指“在编译时”,那么(根据我的理解)是的。
  • @Artur Keyan:无论哪种表达式总是可以计算为常量结果(即使用常量字面值)。如果你乘以 -1 * someVar 这样的数字变量,它不会优化它。
【解决方案2】:

Int(或者更确切地说是 Int32)可以保存任何 32 位整数值。范围从 -2147483648 到 2147483647。

-1 * -2147483648 = 2147483648。这大于最大 Int32 值。这就是你得到溢出的原因。

如果您想进行计算,您可以将其中一个值转换为 Int64。所以这应该有效:

(Int64)(-1)*int.MinValue;

【讨论】:

    【解决方案3】:

    没有必要进行特殊检查 - 值自然会溢出。就像:

    Console.WriteLine(int.MaxValue + 1);
    

    这显然溢出了int - 它与int.MinValue * -1 的值相同。

    来自 C# 4 规范的第 7.19 节:

    除非将常量表达式显式放置在未经检查的上下文中,否则在表达式的编译时求值期间发生在整数类型算术运算和转换中的溢出总是会导致编译时错误。

    【讨论】:

      【解决方案4】:

      有值的运行时检查。 int 值从 -21474048 到 +21474047(为什么?2's complement)。所以你得到了一个例外。

      【讨论】:

        猜你喜欢
        • 2011-04-07
        • 2020-01-16
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 2014-10-04
        • 2021-05-25
        • 1970-01-01
        • 2018-04-08
        相关资源
        最近更新 更多