球球大佬帮忙看一下为什么会数据溢出,大一小白

#include <stdio.h>
 int main()
{  FILE *fp; long i,a[40]={1,1},s=2;
   /****考生在以下空白处写入执行语句 ******/
    for(i=3;i<=40;i++)
    {
        a[i]=a[i-2]+a[i-1];
        s=s+a[i];
        a[i-2]=a[i-1],a[i-1]=a[i];
    }
    printf("%d\n",a[33]);
   /****考生在以上空白处写入执行语句 ******/
   printf("%d\n",s);
   fp=fopen("CD1.dat","wb");
   fwrite(&s,4,1,fp);
   fclose(fp);
}

 

这是求斐波那契前40项的和的代码,但是发现a[33]出现了数据溢出,a[33]变成了一个负数,请问这是什么原因,然后该怎么解决

#include <vector>
#include <stdio.h>
#pragma warning(disable:4996)
#include <iostream>
#include <fstream>
#include <sstream>
#include <string.h>
using namespace std;
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include<windows.h>
#include <time.h>
#include <stdio.h>
int main()
{
    FILE* fp; long i, a[40] = { 1,1 }, s = 2;
    /****考生在以下空白处写入执行语句 ******/
    for (i = 3; i <= 40; i++)
    {
        a[i] = a[i - 2] + a[i - 1];
        s = s + a[i];
        int temp = a[i - 2];
        a[i - 2] = a[i - 1];
        a[i - 1] = temp;

        temp = a[i - 1];
        a[i - 1] = a[i];
        a[i] = temp;
    }
    printf("%d\n", a[33]);
    /****考生在以上空白处写入执行语句 ******/
    printf("%d\n", s);
    fp = fopen("CD1.dat", "wb");
    fwrite(&s, 4, 1, fp);
    fclose(fp);
}

 

数组下标溢出,数组长度为40 ,下标范围为 0-39

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632