Types fondamentaux
Remonter à Syntaxe de déclaration - Index
Sommaire
Les spécificateurs de types fondamentaux sont construits à partir des mots clés suivants :
char |
__int8 |
long |
double |
__int16 |
signed |
float |
__int32 |
short |
int |
__int64 |
unsigned |
A partir de ces mots clés, vous pouvez construire des types intégrals et à virgule flottante, appelés aussi types arithmétiques. Les modificateurs long, short, signed et unsigned peuvent être appliqués aux types intégrals. Le fichier include limits.h contient les définitions des intervalles de valeurs pour tous les types fondamentaux.
Types intégrals
char, short, int et long, ainsi que leurs variants non signés, sont tous considérés comme des types de données intégrals. Le tableau ci-dessous présente les spécificateurs de types intégrals, avec les synonymes listés sur la même ligne.
char, signed char |
Synonymes si char par défaut est défini sur signed. |
unsigned char |
|
char, unsigned char |
Synonymes si char par défaut est défini sur unsigned. |
signed char |
|
int, signed int |
|
unsigned, unsigned int |
|
short, short int, signed short int |
|
unsigned short, unsigned short int |
|
long, long int, signed long int |
|
unsigned long, unsigned long int |
|
signed long long, long long int |
|
unsigned long long, unsigned long long int |
Remarque : Ces synonymes ne sont pas valides en C++. Voir Les trois types char.
signed ou unsigned peut seulement être utilisé avec char, short, int ou long. Les mots clés signed et unsigned, utilisés seuls, signifient respectivement signed int et unsigned int.
En l'absence de unsigned, signed est assumé pour les types intégrals. Une exception survient avec char. Vous pouvez définir la valeur par défaut pour char sur signed ou unsigned. Si vous ne la définissez pas vous-même, la valeur par défaut est signed. Si la valeur par défaut est définie sur unsigned, la déclaration char ch déclare alors ch comme unsigned. Vous devez utiliser signed char ch pour redéfinir la valeur par défaut. De même, avec la valeur par défaut signed pour char, vous avez besoin d'un unsigned char ch explicite pour déclarer un unsigned char.
Seulement long ou short est utilisable avec int. Les mots clés long et short, utilisés seuls, signifient long int et short int.
ANSI C ne fixe pas les tailles ou les représentations internes de ces types, sauf pour indiquer que short, int et long forment une séquence non décroissante avec "short <= int <= long". Ces trois types peuvent légalement être les mêmes. C'est important si vous écrivez un code portable vers d'autres plates-formes.
Le compilateur considère les types int et long comme équivalents, leur taille étant de 32 bits. Les variantes signées sont toutes stockées dans le format complément à 2, le bit de poids le plus fort étant le bit de signe : 0 pour positif, 1 pour négatif (ce qui explique les intervalles présentés dans Types de données 32 bits, tailles et intervalles de valeurs). Dans les versions non signées, tous les bits sont utilisés pour permettre d'écrire des nombres de 0 - (2 puissance n - 1), où n est égal à 8, 16 ou 32.
Types à virgule flottante
Les représentations et les ensembles de valeurs des types à virgule flottante sont fonction de l'implémentation, à savoir que chaque implémentation de C est libre de les définir. Le compilateur utilise les formats à virgule flottante IEEE. Voir la rubrique Standards spécifiques à l'implémentation ANSI.
float et double sont des types de données à virgule flottante 32 et 64 bits, respectivement. long est utilisable avec double pour déclarer un identificateur à virgule flottante d'une précision de 80 bits : long double test_case, par exemple.
Le tableau de la rubrique Types de données 32 bits, tailles et intervalles de valeurs indique les allocations de stockage des types à virgule flottante.
Conversions arithmétiques standard
Quand vous utilisez une expression arithmétique telle que a + b, où a et b sont d'un type arithmétique différent, le compilateur exécute certaines conversions internes avant l'évaluation de l'expression. Ces conversions standard supposent le passage de types "inférieurs" à des types "supérieurs" à des fins de précision et de cohérence.
Voici comment procède le compilateur pour convertir les opérandes d'une expression arithmétique :
- Tous les types intégrals petits sont convertis comme indiqué dans la section "Méthodes utilisées dans les conversions arithmétiques standard" de la rubrique Types fondamentaux. Après quoi, les deux valeurs associées à un opérateur sont soit int (y compris les modificateurs long et unsigned), soit de type double, float ou long double.
- Si l'un des opérandes est de type long double, l'autre opérande est converti en long double.
- Sinon, si l'un des opérandes est de type double, l'autre opérande est converti en double.
- Sinon, si l'un des opérandes est de type float, l'autre opérande est converti en float.
- Si l'un des opérandes est de type unsigned long, l'autre opérande est converti en unsigned long.
- Sinon, si l'un des opérandes est de type long, l'autre opérande est converti en long.
- Sinon, si l'un des opérandes est de type unsigned, l'autre opérande est converti en unsigned.
- Sinon, les deux opérandes sont de type int.
Le résultat de l'expression est du même type que les deux opérandes.
Méthodes utilisées dans les conversions arithmétiques standard
Type | Converti en | Méthode |
---|---|---|
char |
int |
Zéro ou extension du signe (selon le type par défaut de char) |
unsigned char |
int |
Octet de poids fort rempli par 0 (toujours) |
signed char |
int |
Extension du signe (toujours) |
short |
int |
Même valeur ; extension du signe |
unsigned short |
unsigned int |
Même valeur ; rempli par 0 |
enum |
int |
Même valeur |
Conversions spéciales char, int et enum
Remarque : Les conversions abordées dans cette section sont spécifiques au compilateur C++Builder bcc32.exe.
L'affectation d'un objet caractère signé (tel qu'une variable) à un objet intégral entraîne l'extension automatique du signe. Les objets de type signed char utilisent toujours l'extension du signe ; les objets de type unsigned char définissent toujours l'octet de poids fort sur zéro quand ils sont convertis en int.
La conversion d'un type intégral long en un type court tronque les bits de poids fort sans toucher aux bits de poids faible. La conversion d'un type intégral court en un type long entraîne une extension du signe ou le remplissage par des zéros des bits supplémentaires de la nouvelle valeur, selon que le type plus court est respectivement signed ou unsigned.
Voir aussi
- Int8, int16, int32, int64, int64 non signés, types entiers étendus
- Définitions facultatives
- Déclarations possibles
- Définitions et déclarations externes
- Catégories de types
- Initialisation
- Déclaration et déclarateurs
- Modificateurs de variables
- Modificateurs de fonctions
- Types de données Windows 64 bits comparés aux types de données Windows 32 bits