为什么当我输入的数字过大时输出会有负数

#include <iostream>
using namespace std;
int main()
{
    int N;
    cin >> N;
    int* p = new int[N];
    p[0] = 0, p[1] = 1;
    int n;
    for (n = 2; n < N; n++)
        p[n] = p[n - 1] + p[n - 2];
    for (n = 0; n < N; n++)
    {
        cout << p[n] << ",";
        if ((n + 1) % 8 == 0) cout << endl;
    }
    delete[]p;
    return 0;
}

如图
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/571082797236116.png "=600 #left")

如图

溢出了就可能成为负数。
比如char类型的取值范围是-128到127,如果
char ch = 300;那么ch实际就是个负数

这是整数溢出的问题,是计算机的基本原理引起的。计算机在内部用字节来存储整数,比如现在通常默认int型为4字节整数,也就是32个二进制位,由于还有符号位,这样它能表达的最大正整数是2^31-1,即2147483647,最小的负整数就是-2147483648。C语言在运算的时候,如果溢出了它能表示的最大范围,它仍强行存放在4字节里,你就会感觉很大的正数变为了负数。

1134903170 + 1836311903 = 2971215073,可以看出它超过了32位可表示的最大整数值,所以它绕回去了。
2971215073 - 2 ^ 32 = -1323752223
你的那个负数就是这样得到的。

另外:
8位整数的范围是-128 ~ 127
8位无符号整数的范围是0 ~ 255
你很容易算出16位、64位的整数、无符号整数的表示范围。

说一点题外话,这种溢出看上去好像问题不大,但稍不小心,可能造成重大的金钱损失。
比如某加密货币编程的时候没有把这类问题控制好,一个减法产生了溢出,1-2=?,在计算机里用了32位正整数表示,结果产生了一个天文数字,黑客利用这个漏洞,在自己的钱包里产生了巨额加密货币,再把它们迅速抛售,结果那个加密货币就顷刻之间归零了。