tipos
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
tipos [2014/08/06 15:48] – [El sistema de tipos de C] lmateu | tipos [2020/03/17 23:38] (actual) – [Inferencia de tipos] lmateu | ||
---|---|---|---|
Línea 7: | Línea 7: | ||
* Las reglas de inferencia del tipo de una expresión | * Las reglas de inferencia del tipo de una expresión | ||
* Como se definen nuevos tipos de datos | * Como se definen nuevos tipos de datos | ||
- | |||
- | ==== Tipos de datos primitivos ==== | ||
C ofrece los siguientes tipos primitivos: | C ofrece los siguientes tipos primitivos: | ||
Línea 17: | Línea 15: | ||
C no define tipos especiales para valores booleanos (como en Java: boolean) o para los strings (como en Java: String). | C no define tipos especiales para valores booleanos (como en Java: boolean) o para los strings (como en Java: String). | ||
- | ==== Representación de números en binario | + | ===== Tipos numéricos enteros ===== |
Los enteros se almacenan internamente en binario. Por ejemplo: | Los enteros se almacenan internamente en binario. Por ejemplo: | ||
Línea 55: | Línea 53: | ||
* Observe que el rango de representación no es simétrico: en 32 bits -2< | * Observe que el rango de representación no es simétrico: en 32 bits -2< | ||
- | * 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 | + | * Observe que aún cuando |
* 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. | ||
+ | |||
+ | Advertencia: | ||
==== Representación de números negativos ==== | ==== Representación de números negativos ==== | ||
Línea 103: | Línea 103: | ||
Observe que si x e y son sin signo, x-y todavía se calcula como x+~y+1. | Observe que si x e y son sin signo, x-y todavía se calcula como x+~y+1. | ||
- | ==== Tipos reales ==== | + | ===== Tipos reales |
* Los números reales se representan en notación de punto flotante (en binario). | * Los números reales se representan en notación de punto flotante (en binario). | ||
Línea 124: | Línea 124: | ||
implementaban por software. | implementaban por software. | ||
- | ==== Expresiones y operadores ==== | + | Cuando se opera con números reales y se produce un desborde, el resultado es un //not a number// (NaN). |
+ | |||
+ | ===== Expresiones y operadores | ||
Java heredó los operadores de C y C++. | Java heredó los operadores de C y C++. | ||
Para más detalles sobre los operadores de C consultar la [[http:// | Para más detalles sobre los operadores de C consultar la [[http:// | ||
- | === Precedencia === | + | ==== Precedencia |
La precedencia de los operadores es la que dicta cómo se hace la parentización en caso de ambigüedad. | La precedencia de los operadores es la que dicta cómo se hace la parentización en caso de ambigüedad. | ||
Línea 135: | Línea 137: | ||
Si ha escrito una expresión y tiene dudas sobre la precedencia consulte la [[http:// | Si ha escrito una expresión y tiene dudas sobre la precedencia consulte la [[http:// | ||
- | === Asociatividad === | + | ==== Asociatividad |
- | En caso de ambigüedad con // | + | En caso de ambigüedad con // |
Para la mayoría de los operadores la regla de asociatividad es de izquierda a derecha pero hay excepciones: | Para la mayoría de los operadores la regla de asociatividad es de izquierda a derecha pero hay excepciones: | ||
- | La otra excepción son los operadores de indirección y post-incremento, | + | La otra excepción son los operadores de indirección y post-incremento, |
Un resumen de los operadores, su precedencia y asociatividad se encuentra en: [[http:// | Un resumen de los operadores, su precedencia y asociatividad se encuentra en: [[http:// | ||
Línea 147: | Línea 149: | ||
- | ==== Inferencia de tipos ==== | + | ===== Inferencia de tipos ===== |
Las reglas de inferencia de tipos indican cual es el tipo de la expresión: e< | Las reglas de inferencia de tipos indican cual es el tipo de la expresión: e< | ||
Línea 195: | 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. | + | Por lo tanto //a+1// se realiza en 32 bits con signo. |
- | **Ejercicio**: | + | **Ejercicio**: |
< | < | ||
Línea 207: | Línea 209: | ||
</ | </ | ||
+ | Resumen: | ||
- | === Mezcla | + | * El rango de un tipo numérico es el intervalo de números que puede representar. |
+ | * Los tipos numéricos están estrictamente ordenados por su rango: | ||
+ | * %% char < short <= int <= long <= long long < float < double %% | ||
+ | * Cuando se realiza una operación numéricas entre tipos distintos, el operando | ||
+ | * No se realizan operaciones aritméticas con un tipo de rango inferior a int. Es decir cuando un operando es de tipo char o short se convierte implícitamente al menos a un int. | ||
- | En Ansi C también se especifica que si un operando es con signo y el otro sin signo, entonces el operando sin signo se convierte implícitamente a un tipo con signo y la operación se realiza con signo. | + | ==== Mezcla de operandos |
- | ==== Definición | + | A partir |
- | En C se definen nuevos tipos con struct, union, enum y typedef. | + | ===== El costo de las operaciones |
- | + | ||
- | ==== El costo de las operaciones ==== | + | |
Dado que C es un lenguaje en donde interesa la eficiencia, resulta importante conocer cual es el costo de las operaciones aritméticas en términos de su latencia. | Dado que C es un lenguaje en donde interesa la eficiencia, resulta importante conocer cual es el costo de las operaciones aritméticas en términos de su latencia. | ||
Línea 233: | Línea 238: | ||
En los procesadores menos recientes (Sandy Bridge) pueden ser 1 ciclo por cada 2 bits del divisor e incluso | En los procesadores menos recientes (Sandy Bridge) pueden ser 1 ciclo por cada 2 bits del divisor e incluso | ||
1 ciclo por cada bit del divisor (más lento). | 1 ciclo por cada bit del divisor (más lento). | ||
+ | |||
+ | ===== Definición de nuevos tipos ===== | ||
+ | |||
+ | En C se definen nuevos tipos con struct, union, enum y typedef. | ||
tipos.1407340106.txt.gz · Última modificación: 2014/08/06 15:48 por lmateu