>>20
そりゃ問題を読み落としてたスマン
というかそんな問題で悩んでたのか?
unsignedを使えば常にsignedの倍の幅があるので比較は普通にできると思うが

int get_val( char *p )
{
unsigned int val =0;
int inverse =0;

/* +-符号の処理... */
switch( *p ){
case '+': p++; break;
case '-': p++; inverse =1; break;
}

while( *p && isdigit(*p )){
val = val * 10 + (*p -'0');
if( val > INT_MAX ) {
/* オーバーフロー処理... */
}
p++;
}

if( inverse ) return -(int)val;
else return (int)val;
}