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

本文关键字:返回 MaxValue int Square 为什么 | 更新日期: 2024-07-27 18:37:33

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

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

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

当我使用这样的方法时:

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

这就是结果:

结果:1

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

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

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

您会注意到int i = Int32.MaxValue + 1也有类似的情况。

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

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

为什么要编译它?因为编译器无法检查是否会发生溢出。它可以通过编译时间常数做到这一点:

int result = Int32.MaxValue * Int32.MaxValue;

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

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

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

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

溢出的高阶位将被丢弃,只剩下0x 0000 0001