请问这个求n的阶乘程序为什么会产生这种结果?

img
如图


#include <stdio.h>
void main() {
    int fac(int num);
    int n = 1;
    int num;
    for (num = 0; num <= 20; ++num) {
        printf("%d! = %d\n", num, fac(num));
    }
}
int fac(int num) {
    register int n = 1, i;     //寄存器变量
        for (i = 1; i < num; i++) {
            n = n * i;
        }
        return n;
}

fac里for循环应该是i<=num

13! 就超 int 型数值范围了,修改如下,供参考:

#include <stdio.h>
void main() {
    __int64 fac(int num);
    int n = 1;
    int num;
    for (num = 0; num <= 20; ++num) {
        printf("%3d! = %I64d\n", num, fac(num));
    }
    
}
__int64 fac(int num) {
    register __int64 n = 1, i;     //寄存器变量
        for (i = 1; i <= num; i++) {
            n = n * i;
        }
        return n;
}


//2^31 = 2,147,483,648