Una recomendación a ivance96. Para que el código sea más portable, recordemos que los tipos enteros no tienen una longitud rígidamente definida, por ejemplo en algunas máquinas (antiguas) los enteros son de 16bits, y en otras de 32bits. Si mal no recuerdo, la norma indica que la longitud de
int debe estar entre la longitud de
short y la de
long, pero la elección entre ambos depende de la implementación. Debiendo ser la longitud de short de al menos 16 bits, y la de long de al menos 32 bits. Así que por ejemplo una implementación en particular (quizá en el futuro, para una máquina potente) pudiera tener
short de 32 bits,
int de 64 bits y
long de 64 bits.
La biblioteca
<limits.h> define los máximos posibles para los distintos tipos aritméticos según la puesta en práctica. Por ejemplo,
CHAR_MAX,
SHRT_MAX,
UINT_MAX define los máximos de
char,
short int y
unsigned int respectivamente, y son valores que dependen de la implementación de C en tu máquina particular. Así que el programa podría quedar algo así como:
/** INT && UINT **/
if(s[0]=='-')
sign=true;
if ( allNumeric(s.substr(sign, s.size()))) {
if(sign) {
if ( atoi(s.substr(1, s.size())) <= INT_MAX )
type+=type_int;
}else{
if ( atoi(s.substr(0, s.size())) <= INT_MAX )
type+=type_int;
if ( atoi(s.substr(0, s.size())) <= UINT_MAX)
type+=type_uint;
}
}
el cual es transportable sin problemas de una máquina a otra.
Si, bueno. Salvo en el float y el double, que era un terrible follón traducirlo de char* a float/double, en las otras comprobaciones lo intentaba hacer sin las funciones atoi y parecidas.