为什么函数不给出整数溢出

Why functions do not give integer overflow

我用 C++ 和 Pascal 编写了函数,它们给出了第 n 个斐波那契数。正如预期的那样,对于大 n 值(n>92,因为即使 f(93) > 2^63+1)我得到的结果也不正确。
但是当我将它们比较为相同的 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^63 - 1) 而不是 (2^63 + 1)。

当一个数字溢出时,它会寻找封闭数字中的下一个值 "loop"。

假设它以 0 开头并以 8 结尾,所以如果您的 var 值为 8 并且您对其进行 ++,那么它将为 0。

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

在你的例子中,Pascal 和 C++ 程序使用相同的底层硬件,具有相同的 int64long long 表示,并且它们指示硬件对数字执行相同的数学运算序列开始一样。因此,它们确实得到了相同的数字,代表了这一系列操作的最终结果。

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