[C con Clase] Coherencia de tipos
Narcis Garcia - GiLUG
informatica en actiu.net
Vie Nov 28 10:34:51 CET 2008
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" (entero
de 16 bits), a menos que esto también varíe de un compilador a otro. 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.
¿Alguien sabe qué rangos acepta la declaración de una matriz? ¿0 a
65535? ¿0 a 255? ¿0 a 32767? ¿0 a 4294967295?
¿Hay alguna función/operador que devuelva el tipo de un dato?
El dv 28 de 11 de 2008 a les 03:56 -0500, en/na srd4121 en njit.edu va
escriure:
> Hola Narcis,
>
> Quoting Narcis Garcia - GiLUG <informatica en actiu.net>:
>
> > - El operador al que yo llamo función 'sizeof', ¿qué tipo de dato
> > devuelve? En el código que sigue, declaro un "unsigned short int" para
> > recoger su resultado, pero ¿es correcto?
> >
>
> El operador 'sizeof' calcula el operando, o la expresión sin ser evaluada,
> resultando en un número entero de tipo 'int'.
>
> > - ¿Qué tipo de dato esperan los rangos de las matrices a la hora de
> > declararlas? En el código que sigue especifico un 10U (unsigned short
> > int), pero ¿es correcto? ¿es lo adecuado?
> >
>
> Se espera un número entero de tipo 'int'. Como 'unsigned short int' es "menor"
> que 'int', no hay muchos problemas, ya que el compilador puede promocionar ese
> valor de menor tipo a uno de mayor.
>
> > - En un entorno de 32-bits, los punteros son números naturales de 32
> > bits (unsigned) o enteros (signed) ?
> >
>
> Son naturales. No tiene sentido hablar de ubicaciones negativas. Puedes pensar
> que un puntero o mejor dicho una dirección de memoria es análoga a un domicilio
> en el mundo real. Como no tiene sentido hablar de domicilios negativos, pues
> tampoco lo tiene hablar de direcciones negativas de memoria. Lo que sí podemos
> manejar es un número entero (positivo, cero, o negativo) a modo de
> desplazamiento a partir de una dirección de memoria que sirva de base.
>
> > ------
> > CODIGO
> > ------
> >
> > #include <iostream>
> > using namespace std;
> >
> > int NumeroElementosMatriz(long double VariableDentro[], unsigned short
> > int TamanyoDatos)
> > {
> > return TamanyoDatos/sizeof(VariableDentro[0]);
>
> Esto es correcto, pero al final ya sabemos que se trata de un valor de tipo
> 'long double'. Podrías escribir esto explícitamente:
>
> return TamanyoDatos / sizeof(long double);
>
> > }
> >
>
> Espero haber aclarado un poco el tema.
>
> Steven
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Más información sobre la lista de distribución Cconclase