Namespaces
Variants

Límites numéricos

De es.cppreference.net
< c | tipos

Características de los tipos enteros

Características de los tipos enteros del lenguaje núcleo
Definido en el encabezado <limits.h>
BOOL_WIDTH
(C23)
ancho de bits de bool
(constante de macro)
CHAR_BIT
ancho de bits del byte
(constante de macro)
MB_LEN_MAX
número máximo de bytes en un carácter multibyte
(constante de macro)
CHAR_WIDTH
(C23)
ancho de bits de char
(constante de macro)
CHAR_MIN
valor mínimo de char
(constante de macro)
CHAR_MAX
valor máximo de char
(constante de macro)
SCHAR_WIDTHSHRT_WIDTHINT_WIDTHLONG_WIDTHLLONG_WIDTH
(C23)(C23)(C23)(C23)(C23)
ancho de bits de signed char, short, int, long y long long respectivamente
(constante de macro)
SCHAR_MINSHRT_MININT_MINLONG_MINLLONG_MIN
(C99)
valor mínimo de signed char, short, int, long y long long respectivamente
(constante de macro)
SCHAR_MAXSHRT_MAXINT_MAXLONG_MAXLLONG_MAX
(C99)
valor máximo de signed char, short, int, long y long long respectivamente
(constante de macro)
UCHAR_WIDTHUSHRT_WIDTHUINT_WIDTHULONG_WIDTHULLONG_WIDTH
(C23)(C23)(C23)(C23)(C23)
ancho de bits de unsigned char, unsigned short, unsigned int, unsigned long y unsigned long long respectivamente
(constante de macro)
UCHAR_MAXUSHRT_MAXUINT_MAXULONG_MAXULLONG_MAX
(C99)
valor máximo de unsigned char, unsigned short, unsigned int,
unsigned long y unsigned long long respectivamente
(constante de macro)
BITINT_MAXWIDTH
(C23)
ancho máximo N soportado por la declaración de un entero de precisión de bits en el especificador de tipo _BitInt(N)
(constante de macro)
Características de los alias de tipo de la biblioteca
Definido en el encabezado <stdint.h>
PTRDIFF_WIDTH
(C23)
ancho de bits de ptrdiff_t
(constante de macro)
PTRDIFF_MIN
(C99)
valor mínimo de ptrdiff_t
(constante de macro)
PTRDIFF_MAX
(C99)
valor máximo de ptrdiff_t
(constante de macro)
SIZE_WIDTH
(C23)
ancho de bits de size_t
(constante de macro)
SIZE_MAX
(C99)
valor máximo de size_t
(constante de macro)
SIG_ATOMIC_WIDTH
(C23)
ancho de bits de sig_atomic_t
(constante de macro)
SIG_ATOMIC_MIN
(C99)
valor mínimo de sig_atomic_t
(constante de macro)
SIG_ATOMIC_MAX
(C99)
valor máximo de sig_atomic_t
(constante de macro)
WINT_WIDTH
(C23)
ancho de bits de wint_t
(constante de macro)
WINT_MIN
(C99)
valor mínimo de wint_t
(constante de macro)
WINT_MAX
(C99)
valor máximo de wint_t
(constante de macro)
Definido en el encabezado <wchar.h>
Definido en el encabezado <stdint.h>
WCHAR_WIDTH
(C23)
ancho de bits de wchar_t
(constante de macro)
WCHAR_MIN
(C99)
valor mínimo de wchar_t
(constante de macro)
WCHAR_MAX
(C99)
valor máximo de wchar_t
(constante de macro)

Requisitos de valor

BOOL_WIDTH siempre se expande a 1.

(desde C23)

Cada una de las *_WIDTH macros (distintas de BOOL_WIDTH), BITINT_MAXWIDTH,(desde C23) CHAR_BIT y MB_LEN_MAX se expande a un valor definido por la implementación. Los valores mínimos permitidos se enumeran a continuación, donde cada grupo de macros separado por / siempre se expande al mismo valor:

  • al menos 1: MB_LEN_MAX
  • al menos 8: CHAR_BIT / CHAR_WIDTH / SCHAR_WIDTH / UCHAR_WIDTH, WCHAR_WIDTH, SIG_ATOMIC_WIDTH
  • al menos 16: SHRT_WIDTH / USHRT_WIDTH, INT_WIDTH / UINT_WIDTH, PTRDIFF_WIDTH, SIZE_WIDTH, WINT_WIDTH
  • al menos 32: LONG_WIDTH / ULONG_WIDTH
  • al menos 64: LLONG_WIDTH / ULLONG_WIDTH
  • al menos ULLONG_WIDTH: BITINT_MAXWIDTH

Notas

Los tipos de estas constantes, aparte de las *_WIDTH macros, (desde C23)CHAR_BIT y MB_LEN_MAX, deben coincidir con los resultados de las promociones integrales aplicadas a objetos de los tipos que describen: CHAR_MAX puede tener tipo int o unsigned int, pero nunca char. De manera similar, USHRT_MAX no puede ser de un tipo sin signo: su tipo puede ser int.

Una implementación independiente (freestanding) puede carecer de los nombres typedef sig_atomic_t y/o wint_t, en cuyo caso las macros SIG_ATOMIC_* y/o WINT_* están ausentes correspondientemente.

Ejemplo

#include <limits.h>
#include <stdint.h>
#include <stdio.h>

int main(void)
{
    printf("CHAR_BIT       = %d\n", CHAR_BIT);
    printf("MB_LEN_MAX     = %d\n\n", MB_LEN_MAX);
    
    printf("CHAR_MIN       = %+d\n", CHAR_MIN);
    printf("CHAR_MAX       = %+d\n", CHAR_MAX);
    printf("SCHAR_MIN      = %+d\n", SCHAR_MIN);
    printf("SCHAR_MAX      = %+d\n", SCHAR_MAX);
    printf("UCHAR_MAX      = %u\n\n", UCHAR_MAX);
    
    printf("SHRT_MIN       = %+d\n", SHRT_MIN);
    printf("SHRT_MAX       = %+d\n", SHRT_MAX);
    printf("USHRT_MAX      = %u\n\n", USHRT_MAX);
    
    printf("INT_MIN        = %+d\n", INT_MIN);
    printf("INT_MAX        = %+d\n", INT_MAX);
    printf("UINT_MAX       = %u\n\n", UINT_MAX);
    
    printf("LONG_MIN       = %+ld\n", LONG_MIN);
    printf("LONG_MAX       = %+ld\n", LONG_MAX);
    printf("ULONG_MAX      = %lu\n\n", ULONG_MAX);
    
    printf("LLONG_MIN      = %+lld\n", LLONG_MIN);
    printf("LLONG_MAX      = %+lld\n", LLONG_MAX);
    printf("ULLONG_MAX     = %llu\n\n", ULLONG_MAX);
    
    printf("PTRDIFF_MIN    = %td\n", PTRDIFF_MIN);
    printf("PTRDIFF_MAX    = %+td\n", PTRDIFF_MAX);
    printf("SIZE_MAX       = %zu\n", SIZE_MAX);
    printf("SIG_ATOMIC_MIN = %+jd\n",(intmax_t)SIG_ATOMIC_MIN);
    printf("SIG_ATOMIC_MAX = %+jd\n",(intmax_t)SIG_ATOMIC_MAX);
    printf("WCHAR_MIN      = %+jd\n",(intmax_t)WCHAR_MIN);
    printf("WCHAR_MAX      = %+jd\n",(intmax_t)WCHAR_MAX);
    printf("WINT_MIN       = %jd\n", (intmax_t)WINT_MIN);
    printf("WINT_MAX       = %jd\n", (intmax_t)WINT_MAX);
}

Posible salida:

CHAR_BIT       = 8
MB_LEN_MAX     = 16

CHAR_MIN       = -128
CHAR_MAX       = +127
SCHAR_MIN      = -128
SCHAR_MAX      = +127
UCHAR_MAX      = 255

SHRT_MIN       = -32768
SHRT_MAX       = +32767
USHRT_MAX      = 65535

INT_MIN        = -2147483648
INT_MAX        = +2147483647
UINT_MAX       = 4294967295

LONG_MIN       = -9223372036854775808
LONG_MAX       = +9223372036854775807
ULONG_MAX      = 18446744073709551615

LLONG_MIN      = -9223372036854775808
LLONG_MAX      = +9223372036854775807
ULLONG_MAX     = 18446744073709551615

PTRDIFF_MIN    = -9223372036854775808
PTRDIFF_MAX    = +9223372036854775807
SIZE_MAX       = 18446744073709551615
SIG_ATOMIC_MIN = -2147483648
SIG_ATOMIC_MAX = +2147483647
WCHAR_MIN      = -2147483648
WCHAR_MAX      = +2147483647
WINT_MIN       = 0
WINT_MAX       = 4294967295

Características y valores especiales de los tipos de punto flotante

Características de los tipos de punto flotante
Definido en el encabezado <float.h>
modo de redondeo predeterminado de la aritmética de punto flotante
(constante de macro)
especifica con qué precisión se realizan todas las operaciones aritméticas
(constante de macro)
FLT_HAS_SUBNORMDBL_HAS_SUBNORMLDBL_HAS_SUBNORM
(C11)(obsoleto en C23)
especifica si el tipo admite números subnormales (desnormalizados):
-1 – indeterminable, 0 – ausente, 1 – presente
(constante de macro)
FLT_RADIX
la base (base entera) utilizada por la representación de los tres tipos de punto flotante
(constante de macro)
FLT_MANT_DIGDBL_MANT_DIGLDBL_MANT_DIG
número de dígitos base FLT_RADIX que se pueden representar sin perder precisión para float, double y long double respectivamente
(constante de macro)
FLT_DECIMAL_DIGDBL_DECIMAL_DIGLDBL_DECIMAL_DIG
(C11)
conversión de float/double/long double a decimal con al menos FLT_DECIMAL_DIG/DBL_DECIMAL_DIG/LDBL_DECIMAL_DIG dígitos y viceversa es la conversión identidad: esta es la precisión decimal requerida para serializar/deserializar un valor de punto flotante
(constante de macro)
DECIMAL_DIG
(C99)(obsoleto en C23)
conversión de long double a decimal con al menos DECIMAL_DIG dígitos y viceversa a long double es la conversión identidad: esta es la precisión decimal requerida para serializar/deserializar un long double
(constante de macro)
FLT_DIGDBL_DIGLDBL_DIG
número de dígitos decimales que se garantiza que se conservan en el viaje de ida y vuelta (roundtrip) texto → float/double/long double → texto sin cambios debido a redondeo o desbordamiento
(constante de macro)
FLT_MIN_EXPDBL_MIN_EXPLDBL_MIN_EXP
entero negativo mínimo tal que FLT_RADIX elevado a la potencia uno menos que ese entero es un float, double y long double normalizado respectivamente
(constante de macro)
FLT_MIN_10_EXPDBL_MIN_10_EXPLDBL_MIN_10_EXP
entero negativo mínimo tal que 10 elevado a esa potencia es un float, double y long double normalizado respectivamente
(constante de macro)
FLT_MAX_EXPDBL_MAX_EXPLDBL_MAX_EXP
entero positivo máximo tal que FLT_RADIX elevado a la potencia uno menos que ese entero es un float, double y long double finito representable respectivamente
(constante de macro)
FLT_MAX_10_EXPDBL_MAX_10_EXPLDBL_MAX_10_EXP
entero positivo máximo tal que 10 elevado a esa potencia es un float, double y long double finito representable respectivamente
(constante de macro)
FLT_MAXDBL_MAXLDBL_MAX
valor finito máximo de float, double y long double respectivamente
(constante de macro)
FLT_EPSILONDBL_EPSILONLDBL_EPSILON
diferencia entre 1.0 y el siguiente valor representable para float, double y long double respectivamente
(constante de macro)
FLT_MINDBL_MINLDBL_MIN
valor positivo normalizado mínimo de float, double y long double respectivamente
(constante de macro)
FLT_TRUE_MINDBL_TRUE_MINLDBL_TRUE_MIN
(C11)
valor positivo mínimo de float, double y long double respectivamente
(constante de macro)
Valores especiales de los tipos de punto flotante
Definido en el encabezado <math.h>    (obsoleto en C23)
Definido en el encabezado <float.h>  (desde C23)
se evalúa como infinito positivo (si existe)
(constante de macro)
(C99)
se evalúa como un NaN silencioso de tipo float (si existe)
(constante de macro)
Definido en el encabezado <float.h>
se evalúa como un NaN de señalización de float, double y long double respectivamente (si existe)
(constante de macro)

Ejemplo

#include <float.h>
#include <math.h>
#include <stdio.h>

int main(void)
{
    printf("DECIMAL_DIG     = %d\n", DECIMAL_DIG);
    printf("FLT_DECIMAL_DIG = %d\n", FLT_DECIMAL_DIG);
    printf("FLT_RADIX       = %d\n", FLT_RADIX);
    printf("FLT_MIN         = %e\n", FLT_MIN);
    printf("FLT_MAX         = %e\n", FLT_MAX);
    printf("FLT_EPSILON     = %e\n", FLT_EPSILON);
    printf("FLT_DIG         = %d\n", FLT_DIG);
    printf("FLT_MANT_DIG    = %d\n", FLT_MANT_DIG);
    printf("FLT_MIN_EXP     = %d\n", FLT_MIN_EXP);
    printf("FLT_MIN_10_EXP  = %d\n", FLT_MIN_10_EXP);
    printf("FLT_MAX_EXP     = %d\n", FLT_MAX_EXP);
    printf("FLT_MAX_10_EXP  = %d\n", FLT_MAX_10_EXP);
    printf("FLT_ROUNDS      = %d\n", FLT_ROUNDS);
    printf("FLT_EVAL_METHOD = %d\n", FLT_EVAL_METHOD);
    printf("FLT_HAS_SUBNORM = %d\n", FLT_HAS_SUBNORM);
}

Posible salida:

DECIMAL_DIG     = 37
FLT_DECIMAL_DIG = 9
FLT_RADIX       = 2
FLT_MIN         = 1.175494e-38
FLT_MAX         = 3.402823e+38
FLT_EPSILON     = 1.192093e-07
FLT_DIG         = 6
FLT_MANT_DIG    = 24
FLT_MIN_EXP     = -125
FLT_MIN_10_EXP  = -37
FLT_MAX_EXP     = 128
FLT_MAX_10_EXP  = 38
FLT_ROUNDS      = 1
FLT_EVAL_METHOD = 1
FLT_HAS_SUBNORM = 1

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 5.2.4.2 Límites numéricos (p: TBD)
  • 7.22.3 Límites de otros tipos enteros (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 5.2.4.2 Límites numéricos (p: 20-27)
  • 7.20.3 Límites de otros tipos enteros (p: 215-216)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 5.2.4.2 Límites numéricos (p: 26-34)
  • 7.20.3 Límites de otros tipos enteros (p: 293-294)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 5.2.4.2 Límites numéricos (p: 21-28)
  • 7.18.3 Límites de otros tipos enteros (p: 259-260)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 2.2.4.2 Límites numéricos

Véase también

Documentación de C++ para Interfaz de límites numéricos de C