Namespaces
Variants

Integer constant

From cppreference.net

Permet d'utiliser directement des valeurs de type entier dans les expressions.

Table des matières

Syntaxe

Une constante entière est une non-lvalue expression de la forme

decimal-constant integer-suffix  (optionnel) (1)
octal-constant integer-suffix  (optionnel) (2)
hex-constant integer-suffix  (optionnel) (3)
binary-constant integer-suffix  (optionnel) (4) (depuis C23)

  • decimal-constant est un chiffre décimal non nul ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ), suivi de zéro ou plusieurs chiffres décimaux ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )
  • octal-constant est le chiffre zéro ( 0 ) suivi de zéro ou plusieurs chiffres octaux ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 )
  • hex-constant est la séquence de caractères 0x ou la séquence de caractères 0X suivie d'un ou plusieurs chiffres hexadécimaux ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , a , A , b , B , c , C , d , D , e , E , f , F )
  • binary-constant est la séquence de caractères 0b ou la séquence de caractères 0B suivie d'un ou plusieurs chiffres binaires ( 0 , 1 )
  • integer-suffix , s'il est fourni, peut contenir l'un des éléments suivants (sauf que le préfixe non signé peut être combiné avec l'un des autres ; si deux suffixes sont utilisés, ils peuvent apparaître dans n'importe quel ordre) :
  • unsigned-suffix (le caractère u ou le caractère U )
  • long-suffix (le caractère l ou le caractère L ) ou le long-long-suffix (la séquence de caractères ll ou la séquence de caractères LL ) (depuis C99)
  • bit-precise-int-suffix (la séquence de caractères wb ou la séquence de caractères WB ) (depuis C23)

Des guillemets simples optionnels ( ' ) peuvent être insérés entre les chiffres comme séparateur. Ils sont ignorés par le compilateur.

(depuis C23)

Explication

1) Constante entière décimale (base 10, le premier chiffre est le plus significatif).
2) Constante entière octale (base 8, le premier chiffre est le plus significatif).
3) Constante entière hexadécimale (base 16, le premier chiffre est le plus significatif, les lettres a à f représentent les valeurs décimales 10 à 15).
4) Constante entière binaire (base 2, le premier chiffre est le plus significatif).

Les variables suivantes sont initialisées à la même valeur :

int d = 42;
int o = 052;
int x = 0x2a;
int X = 0X2A;
int b = 0b101010; // C23
**Note:** Le code source C++ n'a pas été traduit car il se trouve dans des balises `
` et contient des termes spécifiques au C++. Seul le commentaire "// C23" pourrait être traduit, mais il a été conservé en anglais car il s'agit d'une référence technique à une version du langage.

Les variables suivantes sont également initialisées à la même valeur :

unsigned long long l1 = 18446744073709550592ull; // C99
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C23
unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C23
unsigned long long l4 = 184467'440737'0'95505'92LLU; // C23
**Note:** Le code C++ et les commentaires dans les balises `
` n'ont pas été traduits conformément aux instructions. Seul le texte en dehors des balises de code aurait été traduit, mais dans cet exemple, il n'y a pas de texte supplémentaire à traduire.

Le type de la constante entière

Le type de la constante entière est le premier type dans lequel la valeur peut tenir, dans la liste des types qui dépend de la base numérique et du integer-suffix utilisé.

Types autorisés pour les constantes entières
suffixe bases décimales autres bases
sans suffixe int

long int
unsigned long int (jusqu'en C99)
long long int (depuis C99)

int

unsigned int
long int
unsigned long int
long long int (depuis C99)
unsigned long long int (depuis C99)

u ou U unsigned int

unsigned long int
unsigned long long int (depuis C99)

unsigned int

unsigned long int
unsigned long long int (depuis C99)

l ou L long int

unsigned long int (jusqu'à C99)
long long int (depuis C99)

long int

unsigned long int
long long int (depuis C99)
unsigned long long int (depuis C99)

à la fois l / L et u / U unsigned long int

unsigned long long int (depuis C99)

unsigned long int

unsigned long long int (depuis C99)

ll ou LL long long int (depuis C99) long long int (depuis C99)

unsigned long long int (depuis C99)

à la fois ll / LL et u / U unsigned long long int (depuis C99) unsigned long long int (depuis C99)
wb ou WB _BitInt ( N ) où la largeur N est le plus petit N supérieur à 1 qui peut accommoder la valeur et le bit de signe (depuis C23) _BitInt ( N ) où la largeur N est le plus petit N supérieur à 1 qui peut accommoder la valeur et le bit de signe (depuis C23)
à la fois wb / WB et u / U unsigned _BitInt ( N ) où la largeur N est le plus petit N supérieur à 0 pouvant accommoder la valeur (depuis C23) unsigned _BitInt ( N ) où la largeur N est le plus petit N supérieur à 0 pouvant accommoder la valeur (depuis C23)

Si la valeur de la constante entière est trop grande pour tenir dans l'un des types autorisés par la combinaison suffixe/base, elle ne possède pas les suffixes wb , WB , uwb , ou UWB (depuis C23) et si le compilateur prend en charge les types entiers étendus (tels que __int128 ), la constante peut se voir attribuer le type entier étendu ; sinon, le programme est mal formé.

Notes

Les lettres dans les constantes entières ne sont pas sensibles à la casse : 0xDeAdBaBeU et 0XdeadBABEu représentent le même nombre (une exception est le long-long-suffix , qui est soit ll ou LL , jamais lL ou Ll ) (depuis C99) .

Il n'existe pas de constantes entières négatives. Les expressions telles que - 1 appliquent l' opérateur unaire moins à la valeur représentée par la constante.

Lorsqu'ils sont utilisés dans une expression de contrôle de #if ou #elif , toutes les constantes entières signées agissent comme si elles avaient le type intmax_t et toutes les constantes entières non signées agissent comme si elles avaient le type uintmax_t .

(depuis C99)

Les constantes entières peuvent être utilisées dans les expressions constantes entières .

En raison du maximal munch , les constantes entières hexadécimales se terminant par e et E , lorsqu'elles sont suivies des opérateurs + ou - , doivent être séparées de l'opérateur par un espace ou des parenthèses dans le code source :

int x = 0xE+2;   // erreur
int y = 0xa+2;   // OK
int z = 0xE +2;  // OK
int q = (0xE)+2; // OK

Sinon, un seul jeton de prétraitement numérique invalide est formé, ce qui entraîne l'échec de l'analyse ultérieure.

Exemple

#include <inttypes.h>
#include <stdio.h>
int main(void)
{
    printf("123 = %d\n", 123);
    printf("0123 = %d\n", 0123);
    printf("0x123 = %d\n", 0x123);
    printf("12345678901234567890ull = %llu\n", 12345678901234567890ull);
    // le type est un type 64 bits (unsigned long long ou éventuellement unsigned long)
    // même sans suffixe long
    printf("12345678901234567890u = %"PRIu64"\n", 12345678901234567890u );
    // printf("%lld\n", -9223372036854775808); // Erreur :
        // la valeur 9223372036854775808 ne peut pas tenir dans un signed long long, qui
        // est le plus grand type autorisé pour une constante entière décimale sans suffixe
    printf("%llu\n", -9223372036854775808ull );
    // le moins unaire appliqué à une valeur non signée la soustrait de 2^64,
    // cela donne la valeur non signée 9223372036854775808
    printf("%lld\n", -9223372036854775807ll - 1);
    // manière correcte de former la valeur signée -9223372036854775808
}

Sortie :

123 = 123
0123 = 83
0x123 = 291
12345678901234567890ull = 12345678901234567890
12345678901234567890u = 12345678901234567890
9223372036854775808
-9223372036854775808

Références

  • Norme C23 (ISO/IEC 9899:2024):
  • 6.4.4.1 Constantes entières (p: 57-60)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.4.4.1 Constantes entières (p: 45-46)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 6.4.4.1 Constantes entières (p: 62-64)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 6.4.4.1 Constantes entières (p: 54-56)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 3.1.3.2 Constantes entières

Voir aussi

Documentation C++ pour Integer literal