503288: Lenguaje de Programación Semestre 1 2013 Clase 3, Parte 1 —12Abril, 2013 Prof. Leo Ferres 1 Escriba: Daniel Navarro-Julio Zapata Introducción En esta primera parte de la clase 3 se abarcarán 2 tópicos: • Precedencia de operadores • Tipos de conversión 2 Precedencia de operadores Si no hay paréntesis entonces la precedencia y la asociatividad afectan el agrupamiento y evaluación de los operadores. Ejemplo: 1. r= a+b/c+d En la expresion se evalua primero 2.b/c (porque el simbolo "/" es de mayor importancia) Luego 3. a + (2) (esto porque "+" y "-" se asocian de izquierda a derecha) Finalmente 4. (3) - d 3 Tipos de conversión Se explicará como hace el compilador para modificar cuando se produce una equivocación en los tipos de datos que se están leyendo desde memoria. 3.1 Promoción de enteros Qué pasa si hacemos que un char se almacene en un int o un short en un int? Es fácil hacer esto ya que char y short son mas chicos que int por lo que no hay perdida de información, por lo que todo el valor del char o el short se almacena dentro del int y los bytes mas significativos quedan en 0, en definitiva se esta promoviendo un tipo chico en uno mas grande. 1 -char, short, int, enum(con o sin signo) pueden entrar en operaciones aritméticas, pero pasan cosas inesperadas. Ejemplo: char a= 16; short b= 1024; short c= a + b; En este ejemplo lo que pasa al sumar un char y un short, la computadora pasa ambas cantidades a enteros y los suma, luego los devuelve como short, si eso pasa y se desborda (overflow) (el numero resultante es más grande que short) y se perderá información. 3.2 Conversión de numero de tipo flotante En esta ocasión , analizamos el caso de relacionar un long con un int (mas tamaño a uno de menor tamaño). Lo que sucede en estas circunstancias es que se borrarán los bits mas significativos. 0 1 1 0 1 1 0 0 <— Mayores bits (números de mayor exponente, osea mas grandes, estos se pierden). 1 1 0 0 Conclusión, se pierde información al realizar este tipo de transformaciones. 3.3 3.3.1 Enteros y Decimales conversión implı́cita Ejemplo1: double foo = 42; Si se realiza una impresión como float esta será 42.000000 el compilador realiza esta transformación implı́citamente. También se puede realizar este cambio explicitamente de la forma double bar = 42f; Esta acción tiene el nombre de cast. 2 Ejemplo2: float -->int float c = 3/2; En este caso (3/2) se declaran como enteros por lo que la división generará un numero de la misma ı́ndole, en otras palabras, se conservará la parte entera, y la parte decimal se pierde. Ejemplo3: Para obtener un resultado ”correcto” se requiere castear esto se obtiene agregándole un .0 al numerador, denominador o ambos otra manera puede ser agregándole una f al numerador, denominador o ambos. Haciendo esto obtendremos un resultado de 1.500000. Ejemplo4: int–>float Cuando el entero no es representable en base binaria. float c = 16777217; Este numero no es representable en float de esta manera al imprimir esta variable y dependiendo de la implementación, podrá ser representado como c = 16777216 ó 16777218. Por otro lado si se tiene float c = 167777218; Este numero si será representado correctamente. La formula para tener en cuenta en estas ocasión es (2^2m+1)+1 3.4 siendo m = significando o precision Floats Si tenemos un elemento menos preciso y lo transformamos a uno mas preciso no se pierde información, solo se agregarán 0s. float --> double Se pueden agregar 0s ya sea a la derecha (en la parte decimal) o a la derecha del numero. 3.4.1 Más preciso a uno menos preciso Dependendiendo de la implementación del compilador, puede ser el numero mas cercano ya sea a la izquierda o a la derecha del numero. 3 3.4.2 Fuera de rango Comportamiento indefinido. 3.5 signed vs unsigned char--> int Depende de la implementación si esto generará efectivamente un numero negativo, para evitar esta inseguridad se debe recurrir al uso de signed o unsigned. Bibliografı́a: • https://www.cs.utah.edu/˜regehr/papers/overflow12.pdf • http://www.inf.udec.cl/˜leo/precedence.pdf References [1] Brian W. Kernighan and Dennis Ritchie, The C Programming Language, Second Edition, Prentice-Hall 1988. 4