代码之家  ›  专栏  ›  技术社区  ›  Đumić Branislav

为什么函数不提供整数溢出

  •  2
  • Đumić Branislav  · 技术社区  · 7 年前

    我用C++和Pascal编写了一些函数,它们给出了第n个斐波那契数。正如预期的那样,对于较大的n值(n>92,因为即使是f(93)>我得到了错误的结果。
    但当我将它们与相同的n进行比较时,我会在两种语言中得到相同的结果。


    我想知道为什么我得到了相同的结果,为什么我没有得到整数溢出放在首位。

    谁能给我解释一下吗?

    代码:

    #include <iostream>
    #include <cmath>
    #include <iomanip>
    using namespace std;
    
    long long fibo(int n){
        long long a1,a2,pom;
        int i=1;
        a1 = 0; a2 = 1;
        while(i<=n){
            pom = a2;
            a2 = a1 + a2;
            a1 =  pom;
            i++;
        }
        return a1;
    }
    
    int main(){
        int n;
        cin >> n;
        cout << "Function: "<< setprecision(50) << fibo(n) << endl;
    }
    

    Program AddNums(output);
    function fibo(n:integer):int64;
        var
            a1,a2,pom:int64;
            i:integer;
        begin
            a1:=0;a2:=1;i:=1;
            while(i<=n)do
                begin
                    pom:= a2;
                    a2:= a1 + a2;
                    a1:= pom;
                    inc(i);
                end;
            fibo:=a1;
        end;
    var
        n:integer;
    begin
         readln(n);
        writeln(fibo(n));
    end.
    
    2 回复  |  直到 7 年前
        1
  •  7
  •   Sergey Kalinichenko    7 年前

    结果是 未定义 不一定是 随机的 . 当您在相同的平台上使用相同的初始条件执行相同的计算时,即使结果不正确,也会得到相同的结果。

    在您的情况下,Pascal和C++程序使用相同的底层硬件,具有相同的 int64 long long ,并指示硬件对以相同开头的数字执行相同的数学运算序列。因此,它们确实达到了相同的数目,表示这一系列操作的最终结果。

    结果仍然没有定义,因为如果在不同的平台上运行相同的计算,或者甚至在相同的平台上但使用不同的编译器设置,则可能会得到完全不同的错误结果。

        2
  •  1
  •   Ahmed Salah    7 年前

    首先是(2^63-1)不是(2^63+1)。

    当一个数字溢出时,它会进入闭合数字“循环”中的下一个值。

    假设它以0开始,以8结束,所以如果var值是8,并且你加上它,那么它将是0。