仅使用正整数时返回负值

时间:2011-12-05 16:10:16

标签: 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);
        }
    }

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

1
2
3
5
13
610
-121099088
1

3 个答案:

答案 0 :(得分:12)

你只是看到整数溢出。您正在尝试计算fib(610),这比Int32可以容纳的更多 - 当您将两个大整数相加时,您将获得一个负数。

如果您在“已检查”模式下构建它,则会抛出异常 - 或者您只能为所需的一个表达式执行此操作:

for (int i = 0; i < n; i++)
{
    int temp = a;
    a = b;
    b = checked(temp + b);
}

有关checked arithmetic的更多信息,请参阅MSDN。

答案 1 :(得分:7)

这是整数溢出和使用twos' complement表示整数的结果。

在C#中,默认情况下不检查整数溢出。如果您确实更改为checked上下文,则会出现例外情况。

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

答案 2 :(得分:1)

您的代码正在计算第五个&#39; Fibonacci数字,但它已经得到它的数字&#39; n&#39;从以前的计算。我的猜测是第610个斐波那契数字溢出了int。如果要继续使用此逻辑,请使用unsigned uint或ulong。否则,您需要修改自己确定的方式&#39; n&#39;用于斐波纳契计算。