为什么Square(int.MaxValue)返回1?

时间:2013-12-05 14:00:24

标签: c# behavior

如果这个问题已经存在,我很抱歉,但我还没有在SO上找到它。这就是我问的原因。总之...

假设你有以下非常简单的方法:

public int Square(int i)
{
    return i * i;
}

当我使用这样的方法时:

int result = Square(Int32.MaxValue);
Console.WriteLine("Result: " + result);

结果如下:

  

结果:1​​

为什么编译成功执行,为什么返回1?

3 个答案:

答案 0 :(得分:3)

这是一个简单的整数值溢出。默认情况下,溢出检查已禁用,但如果您要添加checked阻止,则会看到异常:

public int Square(int i)
{
    checked
    {
        return i * i;
    }
}

为什么编译?因为编译器无法检查是否会发生溢出。它可以用编译时常量来做到这一点:

int result = Int32.MaxValue * Int32.MaxValue;

但它在编译期间无法调用方法。

答案 1 :(得分:3)

这是因为int的值不能超过Int32.MaxValueInt32.MaxValue * Int32.MaxValueInt32.MaxValue大得多,因此int变量会溢出。

您会注意到与int i = Int32.MaxValue + 1类似的事情。

答案 2 :(得分:2)

它编译,但它只在unchecked上下文中运行完成,这是编译器的默认值。添加checked块(或指定/checked编译器选项)将在运行时为您提供溢出异常。

如果在未选中的上下文中,结果为1,因为乘法如下:

            0x ffff ffff
*           0x ffff ffff
= 0x ffff fffe 0000 0001

高阶bits that overflow are discarded,留下0x 0000 0001