为什么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?
这是因为int
的值不能大于Int32.MaxValue
。Int32.MaxValue * Int32.MaxValue
比Int32.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
。