Clase 3, Parte 1 —12Abril, 2013 1 Introducción 2 Precedencia de

Anuncio
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
Descargar