关于day_of_year的一个细节性问题

这个函数输入某年的某月某日,就知道是该年的第几天

问题相关代码
static char daytab[2][13] = {
    {0,31,28,31,30,31,30,31,31,30,31,30,31},
    {0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int day_of_year(int year, int month, int day)
{
    int leap;

    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    for (int i = 1; i < month; i++)
        day += daytab[leap][i];
    return day;
}

这里之所以将daytab的元素声明为char类型,是为了说明在char类型的变量中存放较小的非字符整数也是合法的。我对这句话理解得不是很清楚。int数据类型的范围不是远大于char吗?将该数组的元素设置成int也没问题吧?

修改成int也是没有问题的,但是C语言经常应用于一些嵌入式系统中,存储空间不像计算机那么大,特别是对于较大的数组,char和int型占用的空间还是差别很明显的。举个简单的例子,基础51单片机,内部仅仅有128字节的RAM,属于稀缺资源,在定义变量的时候,能用char的就不会用int。