Namespaces
Variants

Numeric limits

From cppreference.net
< c ‎ | types

Table des matières

Limites des types entiers

Limites des types entiers du langage de base
Défini dans l'en-tête <limits.h>
BOOL_WIDTH
(C23)
largeur en bits de _Bool
(constante macro)
CHAR_BIT
largeur en bits de l'octet
(constante macro)
MB_LEN_MAX
nombre maximum d'octets dans un caractère multioctet
(constante macro)
CHAR_WIDTH
(C23)
largeur en bits de char , identique à CHAR_BIT
(constante macro)
CHAR_MIN
valeur minimale de char
(constante macro)
CHAR_MAX
valeur maximale de char
(constante macro)
SCHAR_WIDTH SHRT_WIDTH INT_WIDTH LONG_WIDTH LLONG_WIDTH
(C23) (C23) (C23) (C23) (C23)
largeur en bits de signed char , short , int , long , et long long respectivement
(constante macro)
SCHAR_MIN SHRT_MIN INT_MIN LONG_MIN LLONG_MIN
(C99)
valeur minimale de signed char , short , int , long et long long respectivement
(constante macro)
SCHAR_MAX SHRT_MAX INT_MAX LONG_MAX LLONG_MAX
(C99)
valeur maximale de signed char , short , int , long et long long respectivement
(constante macro)
UCHAR_WIDTH USHRT_WIDTH UINT_WIDTH ULONG_WIDTH ULLONG_WIDTH
(C23) (C23) (C23) (C23) (C23)
largeur en bits de unsigned char , unsigned short , unsigned int , unsigned long , et unsigned long long respectivement
(constante macro)
UCHAR_MAX USHRT_MAX UINT_MAX ULONG_MAX ULLONG_MAX
(C99)
valeur maximale de unsigned char , unsigned short , unsigned int ,
unsigned long et unsigned long long respectivement
(constante macro)
BITINT_MAXWIDTH
(C23)
largeur maximale N prise en charge par la déclaration d'un entier à précision de bits dans le spécificateur de type _BitInt ( N ) , supérieure ou égale à ULLONG_WIDTH
(constante macro)
Limites des alias de type de bibliothèque
Défini dans l'en-tête <stdint.h>
PTRDIFF_WIDTH
(C23)
largeur en bits d'un objet de type ptrdiff_t
(constante macro)
PTRDIFF_MIN
(C99)
valeur minimale de ptrdiff_t
(constante macro)
PTRDIFF_MAX
(C99)
valeur maximale de ptrdiff_t
(constante macro)
SIZE_WIDTH
(C23)
largeur en bits de l'objet de type size_t
(constante macro)
SIZE_MAX
(C99)
valeur maximale de size_t
(constante macro)
SIG_ATOMIC_WIDTH
(C23)
largeur en bits d'un objet de type sig_atomic_t
(constante macro)
SIG_ATOMIC_MIN
(C99)
valeur minimale de sig_atomic_t
(constante macro)
SIG_ATOMIC_MAX
(C99)
valeur maximale de sig_atomic_t
(constante macro)
WINT_WIDTH
(C23)
largeur en bits d'un objet de type wint_t
(constante macro)
WINT_MIN
(C99)
valeur minimale de wint_t
(constante macro)
WINT_MAX
(C99)
valeur maximale de wint_t
(constante macro)
Défini dans l'en-tête <wchar.h>
Défini dans l'en-tête <stdint.h>
WCHAR_WIDTH
(C23)
largeur en bits d'un objet de type wchar_t
(constante macro)
WCHAR_MIN
(C99)
valeur minimale de wchar_t
(constante macro)
WCHAR_MAX
(C99)
valeur maximale de wchar_t
(constante macro)

Notes

Les types de ces constantes, à l'exception de CHAR_BIT et MB_LEN_MAX , doivent correspondre aux résultats des promotions entières appliquées aux objets des types qu'elles décrivent : CHAR_MAX peut avoir le type int ou unsigned int , mais jamais char . De même, USHRT_MAX ne peut pas être de type non signé : son type peut être int .

Une implémentation autonome peut manquer sig_atomic_t et/ou wint_t les noms de typedef, auquel cas les SIG_ATOMIC_* et/ou WINT_* macros sont respectivement absentes.

Exemple

#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);
}

Sortie possible :

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

Limites des types à virgule flottante

Défini dans l'en-tête <float.h>
FLT_RADIX
le radix (base entière) utilisé par la représentation des trois types de nombres à virgule flottante
(constante macro)
DECIMAL_DIG
(C99)
conversion de long double vers décimal avec au moins DECIMAL_DIG chiffres et retour vers long double est une conversion identité : c'est la précision décimale requise pour sérialiser/désérialiser un long double
(constante macro)
FLT_DECIMAL_DIG DBL_DECIMAL_DIG LDBL_DECIMAL_DIG
(C11)
conversion de float / double / long double en décimal avec au moins FLT_DECIMAL_DIG / DBL_DECIMAL_DIG / LDBL_DECIMAL_DIG chiffres et retour est la conversion identité : c'est la précision décimale requise pour sérialiser/désérialiser une valeur en virgule flottante. Défini à au moins 6 , 10 , et 10 respectivement, ou 9 pour float IEEE et 17 pour double IEEE (voir aussi l'analogue C++ : max_digits10 )
(constante macro)
FLT_MIN DBL_MIN LDBL_MIN
valeur normalisée positive minimale de float , double et long double respectivement
(constante macro)
FLT_TRUE_MIN DBL_TRUE_MIN LDBL_TRUE_MIN
(C11)
valeur positive minimale de float , double et long double respectivement
(constante macro)
FLT_MAX DBL_MAX LDBL_MAX
valeur finie maximale de float , double et long double respectivement
(constante macro)
FLT_EPSILON DBL_EPSILON LDBL_EPSILON
différence absolue entre 1.0 et la valeur représentable suivante pour float , double et long double respectivement
(constante macro)
FLT_DIG DBL_DIG LDBL_DIG
nombre de chiffres décimaux garantis d'être préservés dans la conversion texte → float / double / long double → texte sans modification due à l'arrondi ou au dépassement (voir l'analogue C++ digits10 pour les détails)
(constante macro)
FLT_MANT_DIG DBL_MANT_DIG LDBL_MANT_DIG
nombre de chiffres en base FLT_RADIX contenus dans la mantisse des nombres à virgule flottante et pouvant être représentés sans perte de précision pour float , double et long double respectivement
(constante macro)
FLT_MIN_EXP DBL_MIN_EXP LDBL_MIN_EXP
entier négatif minimal tel que FLT_RADIX élevé à la puissance de cet entier moins un donne un float normalisé, un double et un long double respectivement
(constante macro)
FLT_MIN_10_EXP DBL_MIN_10_EXP LDBL_MIN_10_EXP
entier négatif minimum tel que 10 élevé à cette puissance est un float normalisé, double et long double respectivement
(constante macro)
FLT_MAX_EXP DBL_MAX_EXP LDBL_MAX_EXP
entier positif maximum tel que FLT_RADIX élevé à la puissance de cet entier moins un est une valeur finie représentable float , double et long double respectivement
(constante macro)
FLT_MAX_10_EXP DBL_MAX_10_EXP LDBL_MAX_10_EXP
entier positif maximum tel que 10 élevé à cette puissance est un float , double et long double fini représentable respectivement
(constante macro)
mode d'arrondi de l'arithmétique en virgule flottante
(constante macro)
spécifie la précision dans laquelle toutes les opérations arithmétiques sont effectuées
(constante macro)
FLT_HAS_SUBNORM DBL_HAS_SUBNORM LDBL_HAS_SUBNORM
(C11) (obsolète en C23)
indique si le type prend en charge les nombres sous-normaux ( dénormalisés ) :
- 1 – indéterminable, 0 – absent, 1 – présent
(constante macro)

Exemple

#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);
}

Sortie possible :

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

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 5.2.4.2 Limites numériques (p: TBD)
  • 7.22.3 Limites des autres types entiers (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 5.2.4.2 Limites numériques (p : 20-27)
  • 7.20.3 Limites des autres types entiers (p : 215-216)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 5.2.4.2 Limites numériques (p: 26-34)
  • 7.20.3 Limites des autres types entiers (p: 293-294)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 5.2.4.2 Limites numériques (p: 21-28)
  • 7.18.3 Limites des autres types entiers (p: 259-260)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 2.2.4.2 Limites numériques

Voir aussi

Documentation C++ pour l'interface des limites numériques C