Integer constant
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) | |||||||
où
-
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
0xou la séquence de caractères0Xsuivie 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
0bou la séquence de caractères0Bsuivie 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
uou le caractèreU) -
long-suffix
(le caractère
lou le caractèreL) ou le long-long-suffix (la séquence de caractèresllou la séquence de caractèresLL) (depuis C99) -
bit-precise-int-suffix
(la séquence de caractères
wbou la séquence de caractèresWB) (depuis C23)
-
unsigned-suffix
(le caractère
|
Des guillemets simples optionnels (
|
(depuis C23) |
Explication
a
à
f
représentent les valeurs décimales 10 à 15).
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
` 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
` 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é.
| suffixe | bases décimales | autres bases |
|---|---|---|
| sans suffixe |
int
long
int
|
int
unsigned
int
|
u
ou
U
|
unsigned
int
unsigned
long
int
|
unsigned
int
unsigned
long
int
|
l
ou
L
|
long
int
unsigned
long
int
(jusqu'à C99)
|
long
int
unsigned
long
int
|
à 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
|