C# 为什么Square(int.MaxValue)返回1?
如果这个问题已经存在,我深表歉意,但我没有在这里找到它。这就是为什么我要问它。无论如何 假设您有以下非常简单的方法:C# 为什么Square(int.MaxValue)返回1?,c#,behavior,C#,Behavior,如果这个问题已经存在,我深表歉意,但我没有在这里找到它。这就是为什么我要问它。无论如何 假设您有以下非常简单的方法: public int Square(int i) { return i * i; } 当我使用这样的方法时: int result = Square(Int32.MaxValue); Console.WriteLine("Result: " + result); 0x ffff ffff * 0x ffff ffff = 0
public int Square(int i)
{
return i * i;
}
当我使用这样的方法时:
int result = Square(Int32.MaxValue);
Console.WriteLine("Result: " + result);
0x ffff ffff
* 0x ffff ffff
= 0x ffff fffe 0000 0001
结果是:
结果:1
为什么编译和执行成功,为什么返回1?这是一个简单的整数值溢出。默认情况下,已禁用溢出检查,但如果要添加块,则会看到异常:
public int Square(int i)
{
checked
{
return i * i;
}
}
为什么要编译?因为编译器无法检查是否会发生溢出。它可以通过编译时常量实现这一点:
int result = Int32.MaxValue * Int32.MaxValue;
但它不能在编译期间调用方法。这是一个简单的整数值溢出。默认情况下,已禁用溢出检查,但如果要添加块,则会看到异常:
public int Square(int i)
{
checked
{
return i * i;
}
}
为什么要编译?因为编译器无法检查是否会发生溢出。它可以通过编译时常量实现这一点:
int result = Int32.MaxValue * Int32.MaxValue;
但它不能在编译期间调用方法。它编译,但它只在未选中的
上下文中运行到完成,这是编译器的默认设置。添加块(或指定/checked
编译器选项)将在运行时产生溢出异常
如果在未选中的上下文中,结果为1
,因为乘法如下:
int result = Square(Int32.MaxValue);
Console.WriteLine("Result: " + result);
0x ffff ffff
* 0x ffff ffff
= 0x ffff fffe 0000 0001
高阶,留给您的是0x 0000 0001
它编译,但它只在未选中的上下文中运行到完成,这是编译器的默认设置。添加块(或指定/checked
编译器选项)将在运行时产生溢出异常
如果在未选中的上下文中,结果为1
,因为乘法如下:
int result = Square(Int32.MaxValue);
Console.WriteLine("Result: " + result);
0x ffff ffff
* 0x ffff ffff
= 0x ffff fffe 0000 0001
这是因为int
的值不能大于Int32.MaxValue
Int32.MaxValue*Int32.MaxValue
比Int32.MaxValue
大得多,因此int
变量将溢出
您将注意到int i=Int32.MaxValue+1类似的情况,这是因为int
的值不能大于Int32.MaxValue
Int32.MaxValue*Int32.MaxValue
比Int32.MaxValue
大得多,因此int
变量将溢出
您将注意到inti=Int32.MaxValue+1类似的情况
谢谢您的明确回答!:)谢谢你的明确回答!:)@乌兹克没有看到,对不起!:)@乌兹克没有看到,对不起!:)