Herramientas de usuario

Herramientas del sitio


tipos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
tipos [2014/08/06 16:16] lmateutipos [2020/03/17 23:38] (actual) – [Inferencia de tipos] lmateu
Línea 53: Línea 53:
  
   * Observe que el rango de representación no es simétrico: en 32 bits -2<sup>31</sup> es representable, ¡pero 2<sup>31</sup> no lo es!   * Observe que el rango de representación no es simétrico: en 32 bits -2<sup>31</sup> es representable, ¡pero 2<sup>31</sup> no lo es!
-  * Los número negativos se representan en complemento de 2 (esto se estudia en Arquitectura de Computadores).+  * Los número negativos se representan en complemento de 2.
   * En la plataforma Windows de 64 bits, el tipo long es de 32 bits (no es de 64 bits como en Unix).   * En la plataforma Windows de 64 bits, el tipo long es de 32 bits (no es de 64 bits como en Unix).
   * A partir del estandar C99 existe el tipo long long.  Se especifica que debe ser de al menos 8 bytes.   * A partir del estandar C99 existe el tipo long long.  Se especifica que debe ser de al menos 8 bytes.
-  * Observe que aún cuando ya no se fabrican PCs de 32 bits (basados en la arquitectura x86), la mayoría de los smartphones y tablets de hoy usan procesadores ARM de 32 bits.+  * Observe que aún cuando los procesadores de PCs y smartphones son de 64 bits, la mayoría de los smartphones funcionan en modo 32 bits, a no ser que tengan al menos 4 GB de memoria RAM.
   * Tampoco se fabrican PCs de 16 bits, pero se venden muchos procesadores para sistemas embebidos que son de 16 bits, con precios insignificantes al lado de sus hermanos de 32 o 64 bits.  Por razones de costos nadie colocaría un procesador de 32 o 64 bits para controlar una lavadora.   * Tampoco se fabrican PCs de 16 bits, pero se venden muchos procesadores para sistemas embebidos que son de 16 bits, con precios insignificantes al lado de sus hermanos de 32 o 64 bits.  Por razones de costos nadie colocaría un procesador de 32 o 64 bits para controlar una lavadora.
  
Línea 139: Línea 139:
 ==== Asociatividad ==== ==== Asociatividad ====
  
-En caso de ambigüedad con //operadores de la misma precedencia// se usa la regla de asociatividad para determinar la parentización implícita.  Por ejemplo la expresión //a+b-c// es ambigua y los operadores + y - tienen la misma precedencia.  La regla de asociatividad para + y - es de izquierda a derecha y por lo tanto la expresión equivalente es //(a+b)-c//.+En caso de ambigüedad con //operadores de la misma precedencia// se usa la regla de asociatividad para determinar la parentización implícita.  Por ejemplo la expresión //a-b+c// es ambigua y los operadores + y - tienen la misma precedencia.  La regla de asociatividad para + y - es de izquierda a derecha y por lo tanto la expresión equivalente es //(a-b)+c//.
  
 Para la mayoría de los operadores la regla de asociatividad es de izquierda a derecha pero hay excepciones: el operador =.  La expresión //a=b=c// es equivalente a //a=(b=c)// De hecho escribir //(a=b)=c// es un error. Para la mayoría de los operadores la regla de asociatividad es de izquierda a derecha pero hay excepciones: el operador =.  La expresión //a=b=c// es equivalente a //a=(b=c)// De hecho escribir //(a=b)=c// es un error.
  
-La otra excepción son los operadores de indirección y post-incremento, ambos con la misma precedencia.  La expresión //*p++// es ambigua porque se puede referir a //(*p)++// o bien //*(p++)// La regla de asociatividad para estos operadores es de derecha a izquierda de modo que la interpretación correcta es //*(p++)//.+La otra excepción son los operadores de indirección y post-incremento, ambos con la misma precedencia.  La expresión //*p++// es ambigua porque se puede referir a //(*p)++// o bien //*(p++)// La regla de asociatividad para estos operadores es de derecha a izquierda de modo que la interpretación correcta es //*(p++)//.  El operador unario //*// es el operador de indirección y será estudiado en la sección de punteros
  
 Un resumen de los operadores, su precedencia y asociatividad se encuentra en: [[http://users.dcc.uchile.cl/~lmateu/CC3301/apuntes/LenguajeC/#9]] Un resumen de los operadores, su precedencia y asociatividad se encuentra en: [[http://users.dcc.uchile.cl/~lmateu/CC3301/apuntes/LenguajeC/#9]]
Línea 197: Línea 197:
   double x= (double)(a+1);   double x= (double)(a+1);
      
-Por lo tanto //a+1// se realiza en 32 bits con signo.  El resultado en binario es un 1 seguido de 31 ceros, que corresponde al valor entero -2147483648.+Por lo tanto //a+1// se realiza en 32 bits con signo.  El resultado en binario es un 1 seguido de 31 ceros, que corresponde al valor entero -2147483648.  Ese es el valor incorrecto que queda almacenado finalmente en x.  Y no 2147483648 como debería ser.
  
-**Ejercicio**: Reescriba la instrucción de asignación cambiando todas las conversiones implícitas conversiones explícitas.+**Ejercicio**: Reescriba la instrucción de asignación cambiando todas las conversiones implícitas conversiones explícitas.
  
 <code> <code>
tipos.1407341773.txt.gz · Última modificación: 2014/08/06 16:16 por lmateu