for循环求29的阶乘,结果为什么会是负数?

#include<stdio.h>
int main(){
int x,i,m=1;
scanf("%d",&x);
for(i=1;i<=x;i++){
m*=i;
}
printf("%d",m);
return 0;
}

29的阶乘用int型是不够的,long long都不够,用double吧

#include<stdio.h>
int main(){
int x,i;
double m=1;
scanf("%d",&x);
for(i=1;i<=x;i++){
m*=i;
}
printf("%g",m);
return 0;
}

应该是数值太大,溢出了