Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-1201 Programación II - I-2013
Profesor Jeisson Hidalgo-Céspedes
Grupo 03. Entrega límite: 03-abr-2013 11:55 p.m.

Tarea 01

Dado que el tamaño y capacidad de los tipos de datos primitivos de C/C++ varían de acuerdo a la arquitectura a la cual el compilador está generando código objeto, resulta útil tener un programa en C++ que despliegue esta información, de tal forma que ayude al programador a tomar decisiones cuando debe escoger el tipo de datos para una variable. El siguiente sería un ejemplo de ejecución del programa en una arquitectura de 32 bits.

Architecture: 32 bits

DATA TYPE                 SIZE(B) RANGE
bool                            1 {false, true}
char                            1 {-128, ..., 127}
signed char                     1 {-128, ..., 127}
unsigned char                   1 {0, ..., 255}
wchar_t                         2 {0, ..., 65535}
[signed] short [int]            2 {-32768, ..., 32767}
unsigned short [int]            2 {0, ..., 65535}
[signed] int                    4 {-2147483648, ..., 2147483647}
unsigned [int]                  4 {0, ..., 4294967295}
[signed] long [int]             4 {-2147483648, ..., 2147483647}
unsigned long [int]             4 {0, ..., 4294967295}
[signed] long long [int]        8 {-9223372036854775808, ..., 9223372036854775807}
unsigned long long [int]        8 {0, ..., 18446744073709551615}
enum                            4 {-2147483648, ..., 2147483647}
float                           4 6.6 digits
double                          8 15.15 digits
long double                     8 15.15 digits
Pointer                         4 {0, ..., 4294967295}
size_t                          4 {0, ..., 4294967295}
Ejemplo de ejecución del programa en una arquitectura de 32-bits.

Para cada tipo de datos, su programa debe imprimir la cantidad de bytes que ocupa en memoria, utilizando el operador sizeof; y el rango de valores que el tipo de datos puede alojar (el dominio de la variable). El encabezado <limits.h> incluye constantes que indican el valor mínimo y máximo de cada tipo de datos entero. Para las variables de punto flotante, las constantes se encuentran en el encabezado <float.h>; y se sugiere imprimir la cantidad de dígitos decimales que pueden almacenar tanto a la izquierda como derecha del punto decimal, en lugar de los valores extremos.

Su programa debe estar escrito bajo el paradigma de programación procedimental, no importa si en el lenguaje de programación C o C++. Si escoge C++ debe imprimir además los tipos de datos bool y wchar_t. Ambos no tienen constantes de encabezado para sus valores mínimo y máximo, aunque usted puede generarlos manualmente.

Asegúrese de compilar su programa para dos arquitecturas distintas y compare la salida. Preste atención a cuáles tipos de datos cambiarion su tamaño/capacidad, y cuáles se mantuvieron inalterados.

Evaluación

  1. [10%] Imprime la arquitectura como una cantidad de bits. Esto se puede obtener en bytes como el tamaño de cualquier dirección de memoria, utilizando un puntero cualquiera (ejemplo: sizeof(void*)), o el tamaño del tipo de datos size_t.
  2. [10%] Implementa una función para imprimir los tipos de datos carácter: char, signed char, unsigned char. Utiliza las constantes respectivas del encabezado <limits.h>.
  3. [20%] Implementa una función para imprimir los tipos de datos enteros: short, int, long, long long, con y sin signo. Utiliza las constantes respectivas del encabezado <limits.h>.
  4. [15%] Implementa una función que imprime el tamaño de una enumeración, y sus valores mínimos y máximos. Dado que no existen constantes en archivos encabezado para enumeraciones, es fácil calcularlos con una función extra que calcula 2n. Nota: por razones de eficiencia, no utilice la función pow() de la biblioteca <math.h>.
  5. [10%] Implementa una función que imprime el tamaño de los tipos de datos flotantes: float, double y long double. Imprime además la cantidad de dígitos antes y después del punto decimal que puede representar estos tipos de datos de acuerdo al encabezado <float.h>.
  6. [10%] Implementa una función que imprime el tamaño de un puntero cualquiera y el tipo de datos size_t. Ambos tipos de datos son sin signo. Necesitará la función de potencia de 2 para imprimir los valores mínimo y máximo.
  7. [20%] Utiliza adecuadamente el formateo de salida estándar para que los datos aparezcan en formato de tabla, tal como se hizo en el ejemplo de ejecución del programa.
  8. [5%] La función libre main() invoca a las funciones descritas previamente, y retorna 0 al sistema operativo.
  9. [5% Opcional] El código fuente de su programa puede ser compilado tanto con el compilador de C como el compilador de C++. Para esto debe condicionar los tipos de datos de C++ bajo la macro __cplusplus, y utilizar enumeraciones al estilo C o renombrarlas con typedef. Su archivo fuente deberá tener extensión .c y no .cpp.

Para presentar su solución, comprima únicamente los archivos fuente (.c, .cpp, .h) que haya creado y suba el comprimido a la Plataforma Educativa en la asignación con nombre Tarea01.