| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
NOB2014
Registrado: 25 Mar 2014 Mensajes: 3 Ubicación: Argentina - Santa Fé - Arequito
| Publicado: 25/03/2014 6:38 am | | | Título: Valores minimo y maximo de cada uno de los tipos(lenguaje C) |
| Hola a todos. Les dejo lo que tengo hecho para ver si pueden ayudarme a completar el código, tengo unos cuantos errores que muestro a continuación y que por más que busco en el manual con el que estoy estudiando y la web no logro corregir, les confieso además que si no tuviera errores hubiera posteado igual para que me digan si los datos obtenido son los correctos.-
| Código: | /* Programa que muestra Valores mínimo y máximo de cada uno de los tipos(en esta máquina)*/
#include <stdio.h> #include <limits.h> #include <float.h>
int main(void){ char a; short int b; int c; long int d; unsigned char e; unsigned short int f; unsigned int g; unsigned long int h; float i; double j; long double k;
printf("\n\n\t Longitud de cada uno de los tipos basicos");
printf("\n\n La longitud de \"char\" es igual a ................: %2ld byts", sizeof(a)); printf("\n La longitud de \"short int\" es igual a ...........: %2ld bytes", sizeof(b)); printf("\n La longitud de \"int\" es igual a .................: %2ld bytes", sizeof(c)); printf("\n La longitud de \"long int\" es igual a ............: %2ld bytes", sizeof(d)); printf("\n La longitud de \"unsigned char\" es igual a .......: %2ld bytes", sizeof(e)); printf("\n La longitud de \"unsigned short\" es igual a ......: %2ld bytes", sizeof(f)); printf("\n La longitud de \"unsigned int\" es igual a ........: %2ld bytes", sizeof(g)); printf("\n La longitud de \"unsigned long int\" es igual a ...: %2ld bytes", sizeof(h)); printf("\n La longitud de \"float\" es igual a ...............: %2ld bytes", sizeof(i)); printf("\n La longitud de \"double\" es igual a ..............: %2ld bytes", sizeof(j)); printf("\n La longitud de \"long double\" es igual a .........: %2ld bytes", sizeof(k));
printf("\n\n Valores minimo y maximo de cada uno de los tipos");
printf("\n\n Minimo y maximo de \"char\" .......................: %d %d", CHAR_MIN, CHAR_MAX); printf("\n Minimo y maximo de \"short int\" ..................: %d %d", SHRT_MIN, SHRT_MAX); printf("\n Minimo y maximo de \"int\" ........................: %d %d", INT_MIN, INT_MAX); printf("\n Minimo y maximo de \"long int\" ...................: %ld %ld", LONG_MIN, LONG_MAX); printf("\n Maximo de \"unsigned char\" .......................: %u", UCHAR_MAX); printf("\n Maximo de \"unsigned short int\" ..................: %u", USHRT_MAX); printf("\n Maximo de \"unsigned int\" ........................: %u", UINT_MAX); printf("\n Maximo de \"unsigned long int\" ...................: %lu", ULONG_MAX); printf("\n Minimo y maximo de \"float\" ......................: %g %g", FLT_MIN, FLT_MAX); printf("\n Minimo y maximo de \"double\" .....................: %h %h", DBL_MIN, DBL_MAX); printf("\n Minimo y maximo de \"long double\" ................: %L %L", LDBL_MIN, LDBL_MAX); printf("\n\n"); return 0; } |
Un gran saludo. Daniel |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7516 Ubicación: Mexico
| Publicado: 25/03/2014 7:29 am | | | Título: |
| Los dos errores en el programa se encuentran en las dos ultimas llamada a printf:
| Código: | printf("\n Minimo y maximo de \"double\" .....................: %h %h", DBL_MIN, DBL_MAX); printf("\n Minimo y maximo de \"long double\" ................: %L %L", LDBL_MIN, LDBL_MAX); |
Lo correcto para imprimir un valor de tipo double es utilizar "%e", "%f" o "%g", para el tipo long double debes utilizar "%Le", "%Lf" o "%Lg" y ya que vas a imprimir los máximos y mínimos es mejor utilizar "%e" y "%Le" para que estos se impriman en notación científica (lo mas corto posible).
Otro detalle en el programa es imprimir el resultado del operador sizeof (tipo size_t, algún tipo sin signo) utilizando "%d" ya que este es para el tipo signed int. Dependiendo del compilador se puede utilizar:
A) "%zu" para imprimirlo (requiere como mínimo soporte del estándar C99). B) conversión explicita al tipo "unsigned long" e imprimirlo como tal utilizando "%lu" (solo necesario si se compila según el estándar C90).
Ya por ultimo no es necesario calcular el tamaño de los tipo enteros con signo y sin el ya que son los mismos (por ejemplo signed int y unsigned int tienen el mismo tamaño).
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | NOB2014
Registrado: 25 Mar 2014 Mensajes: 3 Ubicación: Argentina - Santa Fé - Arequito
| Publicado: 25/03/2014 10:29 am | | | Título: |
| Hola rir3760. De acuerdo, todo se corrigió, muchas gracias.
| Cita: | Otro detalle en el programa es imprimir el resultado del operador sizeof (tipo size_t, algún tipo sin signo) utilizando "%d" ya que este es para el tipo signed int. Dependiendo del compilador se puede utilizar:
|
Para entender un poco hice el siguiente programita pero no entiendo los resultados, en el otro yoel_alejandro trató de explicármelo pero nada.-
| Código: | #include <stdio.h> #include <limits.h>
int main(void){ unsigned a = sizeof(unsigned) * CHAR_BIT; size_t b; size_t c; printf("\n\n unsigned a = sizeof(unsigned) * CHAR_BIT;"); printf("\n size_t b;"); printf("\n size_t c;");
printf("\n\n a=%d bits --- b=%ld --- c=%ld", a, b, c); return 0; } |
Saludos. Daniel |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 7516 Ubicación: Mexico
| Publicado: 26/03/2014 5:51 am | | | Título: |
| El problema es mezclar dos temas. Por partes.
Uno es obtener el numero de bytes por tipo e imprimir este en la salida estándar. Para lo primero se debe utilizar el operador sizeof y ya que su resultado es de tipo size_t si se quiere almacenar ese valor se debe utilizar una variable del mismo tipo:
| Código: | /* Obtenemos y almacenamos el numero de bytes que componen el tipo int */ size_t num_bytes_int = sizeof(int); |
Como imprimirlo depende del modo de compilación, en C90 se debe convertir explícitamente al tipo unsigned long y utilizar "%lu" en la llamada a printf:
| Código: | size_t num_bytes_int = sizeof(int);
printf("%lu\n", (unsigned long) num_bytes_int); |
En C99 y C11 basta con utilizar el especificador "%zu" en la llamada a printf:
| Código: | size_t num_bytes_int = sizeof(int); printf("%zu\n", num_bytes_int); |
----
El otro es imprimir los valores máximos y mínimos de algún tipo. Aquí lo que debes hacer es declarar una variable del tipo correspondiente o bien utilizar directamente la macro. En la llamada a printf utilizas el especificador que corresponda. Por ejemplo:
| Código: | #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h>
int main(void) { int int_max = INT_MAX; long long_max = LONG_MAX; double dbl_max = DBL_MAX; printf(" INT_MAX == %d\n", int_max); printf("LONG_MAX == %ld\n", long_max); printf(" DBL_MAX == %e\n", dbl_max); printf(" INT_MIN == %d\n", INT_MIN); printf("LONG_MIN == %ld\n", LONG_MIN); printf(" DBL_MIN == %e\n", DBL_MIN); return EXIT_SUCCESS; } |
----
Ya por ultimo si no tienes una referencia de calidad deberías conseguir una, mientras eso sucede puedes utilizar las paginas (en ingles y archivadas) de P. J. Plauger: C90 C99
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | NOB2014
Registrado: 25 Mar 2014 Mensajes: 3 Ubicación: Argentina - Santa Fé - Arequito
| Publicado: 26/03/2014 9:18 am | | | Título: |
| Hola. Ahota si me queda todo más claro.-
Saludos y gracias. Daniel |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |