如果这个问题已经存在,我很抱歉,但我还没有在SO上找到它。这就是我问的原因。总之...
假设你有以下非常简单的方法:
public int Square(int i)
{
return i * i;
}
当我使用这样的方法时:
int result = Square(Int32.MaxValue);
Console.WriteLine("Result: " + result);
结果如下:
结果:1
为什么编译和成功执行,为什么返回1?
答案 0 :(得分:3)
这是一个简单的整数值溢出。默认情况下,溢出检查已禁用,但如果您要添加checked阻止,则会看到异常:
public int Square(int i)
{
checked
{
return i * i;
}
}
为什么编译?因为编译器无法检查是否会发生溢出。它可以用编译时常量来做到这一点:
int result = Int32.MaxValue * Int32.MaxValue;
但它在编译期间无法调用方法。
答案 1 :(得分:3)
这是因为int
的值不能超过Int32.MaxValue
。 Int32.MaxValue * Int32.MaxValue
比Int32.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
。