Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Treppe en 2 Agosto 2011, 15:01 pm



Título: limits.h
Publicado por: Treppe en 2 Agosto 2011, 15:01 pm
Hola, tengo un problema que no se porqué pasa, yo creo que es el compilador, pero como yo no se mucho prefiero consultarlo con alguien que sepa.

Bueno, he estado siguiendo un libro de programación en C, y he escrito un programa para que me diga simplemente la amplitud de los valores a la que pueden llegar las diferentes variables.
/*buscando los límites*/
#include<stdio.h>
#include<limits.h>
#include<float.h>

int main(void)
{
    printf("Las variables de tipo char guardan valores entre %d y %d.",
                                                       CHAR_MIN, CHAR_MAX);
   
    printf("\nLas variables de tipo unsigned char guardan valores entre 0 y %u."
                                                       , UCHAR_MAX);
   
    printf("\nLas variables de tipo short guardan valores entre %d y %d.",
                                                          SHRT_MIN, SHRT_MAX);
   
    printf("\nLas variables de tipo unsigned short guarda valores entre 0 y %u."
                                                        , USHRT_MAX);
   
    printf("\nLas variables de tipo int guardan valores entre %d y %d.",
                                                        INT_MIN, INT_MAX);
   
    printf("\nLas variables de tipo unsigned int guardan valores entre 0 y %u.",
                                                         UINT_MAX);
   
    printf("\nLas variables de tipo long guardan valores entre %ld y %ld.",
                                                         LONG_MIN, LONG_MAX);
   
    printf("\nLas variables de tipo unsinged long guardan valores entre"
                                             "0 y %ld.", ULONG_MAX);
   
    printf("\nLas variables de tipo long long guardan valores "
                               "entre %lld y %lld.", LLONG_MIN, LLONG_MAX);
   
    printf("\nLas variables de tipo unsigned long long guardan valores entre "
                                             "0 y %llu.", ULLONG_MAX);
   
    printf("\nEl tamaño del valor más pequeño de tipo float es"
                                                     " %.3e.", FLT_MIN);
   
    printf("\nEl tamaño del valor más grande de tipo float es %.3e", FLT_MAX);
   
    printf("\nEl tamaño del valor más pequeño de tipo double es"
                                                     " %.3e.", DBL_MIN);
   
    printf("\nEl tamaño del valor más grande de tipo double es %.3e.", DBL_MAX);
   
    printf("\nEl tamaño del valor más pequeño de tipo long "
                                              "double \nes %.3Le.", LDBL_MIN);
   
    printf("\nEl tamaño del valor más grande de tipo long double es %.3Le."
                                                          , LDBL_MAX);
   
    printf("\nLas variables de tipo float tienen %u decimales de precisión."
                                                          , FLT_DIG);
   
    printf("\nLas variables de tipo double tienen %u decimales de precisión."
                                                          , DBL_DIG);
   
    printf("\nLas variables de tipo long double tienen %u decimales de "
                                                "precisión.", LDBL_DIG);
    return 0;
}         
                                         
Es como está en el libro, pero el valor de la variable "long long", a la hora de ejecutar el programa,  no corresponde con la uqe sale en el libro, sino con la variable "long" y "int. Y luego tambien, la variable "long double" me da un número que parece ser producto de un error "0.000e+000" para el valor más pequeño, y "-1.#Q0E+000". Gracias de antelación por la ayuda ^^


Título: Re: limits.h
Publicado por: rir3760 en 3 Agosto 2011, 01:54 am
Hola, tengo un problema que no se porqué pasa, yo creo que es el compilador
En ese caso nos ayudarías como no tienes idea si nos indicas cual estas utilizando.

El único problema en potencia con el programa son los tipos "long long" y "unsigned long long" ya que estos fueron introducidos con el estándar C99. Debes revisar la documentación de tu compilador para saber si soporta esos tipos y que este configurado correctamente.

También debes utilizar "%lu" para imprimir la macro "ULONG_MAX".

Es como está en el libro, pero el valor de la variable "long long", a la hora de ejecutar el programa,  no corresponde con la uqe sale en el libro
Por esa razón se utilizan esas macros: los valores que se indican en un libro son los mínimos garantizados, los valores exactos dependen de la implementación.

Un saludo


Título: Re: limits.h
Publicado por: BlackZeroX en 4 Agosto 2011, 06:45 am
.
los limites dependen de la arquitectura dela computadora, ya que no es lo mismo un int en x32 que en una de x64

Dulces Lunas!¡.


Título: Re: limits.h
Publicado por: rir3760 en 5 Agosto 2011, 03:27 am
Una forma de acortar el programa es mediante una macro utilizando el operador '#' (para delimitar el argumento, en otras palabras convertirlo en cadena literal):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #include <limits.h>
  5. #include <float.h>
  6.  
  7. #define IMPRIMIR(macro, fmt)  printf(#macro ": " fmt "\n", macro)
  8.  
  9. int main (void)
  10. {
  11.   IMPRIMIR(INT_MIN, "% d");
  12.   IMPRIMIR(INT_MAX, "% d");
  13.   putchar('\n');
  14.  
  15.   IMPRIMIR(LONG_MIN, "% ld");
  16.   IMPRIMIR(LONG_MAX, "% ld");
  17.   putchar('\n');
  18.  
  19.   IMPRIMIR(FLT_MIN, "%e");
  20.   IMPRIMIR(FLT_MAX, "%e");
  21.   putchar('\n');
  22.  
  23.   /* ... */
  24.  
  25.   return EXIT_SUCCESS;
  26. }

Un saludo


Título: Re: limits.h
Publicado por: Treppe en 8 Agosto 2011, 19:36 pm
Muchas gracias ^^