Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Square(int.MaxValue)返回1?_C#_Behavior - Fatal编程技术网

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类似的情况

谢谢您的明确回答!:)谢谢你的明确回答!:)@乌兹克没有看到,对不起!:)@乌兹克没有看到,对不起!:)