这是小弟我用递归法写的计算一个整数的位数,和个位数字之和,编译成功,可是结果总是不对,尤其当输出的数字过大的时候,还输出负数。自学中吗,还请多多指教

这是我用递归法写的计算一个整数的位数,和个位数字之和,编译成功,可是结果总是不对,尤其当输出的数字过大的时候,还输出负数。自学中吗,还请多多指教
#include<stdio.h>
int num(int n)
{

 if(n/10<1)
 return 1;
 else
 return( 1+num(n/10));
 }
 int sum(int n)

 {
   if(n/10<1)
   return n;
   else
   return ((n%10)+ num(n/10));}
   int main()
   { int n;
     scanf("%d",&n);
     printf("num=%d\nsum=%d",num(n),sum(n));
     getchar();getchar();}
这是小弟我用递归法写的计算一个整数的位数,和个位数字之和,编译成功,可是结果总是不对,尤其当输出的数字过大的时候,还输出负数。自学中吗,还请多多指教
------解决方案--------------------
别用int或者long,大小有限制,用字符串吧,多长都行(不超过MAX_LEN就行)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 500

long compute(char s[],int n)
{
    if (n>0)
    {
        return (s[n-1]-'0')+compute(s,n-1);
    }
    else
    {
        return 0;
    }
}
int main()
{
    int num, len;
    char s[MAX_LEN];
    printf("Please input a number:\n");
    scanf("%s",&s);
    len = strlen(s);
    printf("Sum is %ld\n",compute(s,len));
    return 0;
}