[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