[C con Clase] Coherencia de tipos

srd4121 en njit.edu srd4121 en njit.edu
Vie Nov 28 12:38:10 CET 2008


Hola Narcis,

Quoting Narcis Garcia - GiLUG <informatica en actiu.net>:

> El siguiente código:
> 
> int main()
> {
>     int a;
>     unsigned int b;
>     signed int c;
>     unsigned short int d;
>     unsigned long int e;
>     a=-1;
>     b=-1;
>     c=-1;
>     d=-1;
>     e=-1;
>     cout << a << endl;
>     cout << b << endl;
>     cout << c << endl;
>     cout << d << endl;
>     cout << e << endl;
>     return 0;
> }
> 
> Me devuelve:
> -1
> 4294967295
> -1
> 65535
> 4294967295
> 
> Lo cual significa que el tipo "int" es en realidad "signed int"

Cierto. Por defecto, los tipos que representan números enteros tienen el
modificador 'signed', por lo que rara vez se usa explícitamente.

> (entero de 16 bits), a menos que esto también varíe de un compilador a otro.

En este ejemplo, 'int' no es de 16 bits, sino de 32. Observa que puedes alcanzar
el valor máximo de 4294967295 = 2^32 - 1. El valor máximo de 16 bits es 65535.

> Sea mejor o peor, yo pregunto por cómo es.
> Estas vueltas alrededor de los tipos las doy porque sé que cuanto más
> coincida todo, menos operaciones de conversión necesitará el compilador,
> y menos resultados inesperados tendré con los números límite.
> 

Si los valores son constantes, entonces no te preocupes mucho por las
conversiones que realice el compilador, ya que esto se hará en tiempo de
compilación. Obviamente, es buena práctica usar el tipo correcto desde el principio.

> ¿Alguien sabe qué rangos acepta la declaración de una matriz? ¿0 a
> 65535? ¿0 a 255? ¿0 a 32767? ¿0 a 4294967295?
> 

Como se basa en 'unsigned int' el intervalo es [1,4294967295]. Algunos
compiladores aceptan 0 (cero) para el tamaño de un array, pero internamente lo
cambia a 1. Otros compiladores usan 'int' en lugar de 'unsigned int', por lo que
el intervalo es de [1,2147483647].

También debes tener en cuenta la cantidad de memoria que se requiere para crear
tal array. Por lo tanto, es posible que el compilador te dé un error, aunque
estés dentro del intervalo correcto.

> ¿Hay alguna función/operador que devuelva el tipo de un dato?
> 

No directamente. Usando la RTTI, podríamos comparar tipos de datos y así
averiguar el tipo que queremos. De todos modos, tu "propuesta" casi nunca es
necesitada; por no decir jamás. Programando en C/C++, uno debe saber los tipos
de cada dato. De hecho, el compilador se quejaría si esto no es así. Si nos
puedes dar un problema en el que no sabes el tipo y quieres averiguarlo,
háznoslo saber.


Espero haber aclarado las dudas.

Steven





Más información sobre la lista de distribución Cconclase