仅使用正整数时返回负值

Doo*_*ard 1 c# math

运行以下代码时,我最终获得负值.我只使用正数,所以我真的很困惑.我试图看看这个负数是否是返回码,但似乎没有任何代码将此作为数字返回.

  public static int fib(int n)
    {
        int a = 0;
        int b = 1;
        for (int i = 0; i < n; i++)
        {
            int temp = a;
            a = b;
            b = temp + b;
        }

        return b;
    }

    static void Main(string[] args)
    {
        int n = 0;
        bool Run = true;

        while (Run == true)
        {
            n = fib(n + 1);
            Console.WriteLine(n);
        }
    }
Run Code Online (Sandbox Code Playgroud)

以下是代码运行时的结果:

1
2
3
5
13
610
-121099088
1
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 12

你只是看到整数溢出.你试图计算fib(610)哪种方式超出了Int32可以容纳的范围 - 当你将两个大整数加在一起时,你会得到一个负数.

如果在"已检查"模式下构建它,则会抛出异常 - 或者您可以仅针对所需的一个表达式执行此操作:

for (int i = 0; i < n; i++)
{
    int temp = a;
    a = b;
    b = checked(temp + b);
}
Run Code Online (Sandbox Code Playgroud)

查看MSDN了解更多检测算法.

  • +1提及已检查,我以前从未见过该关键字. (2认同)

Ode*_*ded 7

这是整数溢出的结果,并且使用了两个补码来表示整数.

在C#中,默认情况下不检查整数溢出.如果您确实更改了checked上下文,则会出现异常.

使用checked上下文,使用uint或甚ulong至 - 您需要确保使用的数据类型可以保存您正在计算的值.