Types fondamentaux

De RAD Studio
Aller à : navigation, rechercher

Remonter à Syntaxe de déclaration - Index


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
(ISO C99, C++11)

unsigned long long, unsigned long long int
(ISO C99, C++11)


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 :

  1. 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.
  2. Si l'un des opérandes est de type long double, l'autre opérande est converti en long double.
  3. Sinon, si l'un des opérandes est de type double, l'autre opérande est converti en double.
  4. Sinon, si l'un des opérandes est de type float, l'autre opérande est converti en float.
  5. Si l'un des opérandes est de type unsigned long, l'autre opérande est converti en unsigned long.
  6. Sinon, si l'un des opérandes est de type long, l'autre opérande est converti en long.
  7. Sinon, si l'un des opérandes est de type unsigned, l'autre opérande est converti en unsigned.
  8. 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