Corrigez-moi si je me trompe,
int est de 4 octets, avec une plage de valeurs de -2,147,483,648 à 2,147,483,647 (2 ^ 31)
long est de 4 octets, avec une plage de valeurs de -2,147,483,648 à 2,147,483,647 (2 ^ 31)
Quelle est la différence en C ++? Peuvent-ils être utilisés de manière interchangeable?
#include <stdint.h>
et ensuite les types qui indiquent la taille. Par exempleuint32_t
. Sur une nouvelle plate-forme, il vous suffit de vous assurer que stdint.h convient parfaitement à cette plate-forme particulière et que votre code fonctionne comme prévu.Réponses:
Cela dépend de la mise en œuvre.
Par exemple, sous Windows, ce sont les mêmes, mais par exemple sur les systèmes Alpha, un long était de 64 bits alors qu'un int était de 32 bits. Cet article couvre les règles du compilateur Intel C ++ sur les plates-formes variables. Résumer:
la source
Les seules garanties dont vous disposez sont:
Voir aussi: Est-il
long
garanti avoir au moins 32 bits?la source
Lors de la compilation pour x64, la différence entre int et long se situe entre 0 et 4 octets, selon le compilateur que vous utilisez.
GCC utilise le modèle LP64, ce qui signifie que les entiers sont 32 bits mais les longs sont 64 bits en mode 64 bits.
MSVC, par exemple, utilise le modèle LLP64, ce qui signifie que les entiers et les longs sont 32 bits même en mode 64 bits.
la source
La spécification C ++ elle-même (ancienne version mais suffisante pour cela) laisse cela ouvert.
la source
Comme le souligne Kevin Haines, les entiers ont la taille naturelle suggérée par l'environnement d'exécution, qui doit tenir dans INT_MIN et INT_MAX.
La norme C89 stipule qu'il
UINT_MAX
doit être au moins 2 ^ 16-1,USHRT_MAX
2 ^ 16-1 etULONG_MAX
2 ^ 32-1. Cela fait un nombre de bits d'au moins 16 pour court et int, et 32 pour long. Pour char, il indique explicitement qu'il doit avoir au moins 8 bits (CHAR_BIT
). C ++ hérite de ces règles pour le fichier limits.h, donc en C ++, nous avons les mêmes exigences fondamentales pour ces valeurs. Vous ne devez cependant pas en déduire que int est au moins 2 octets. Théoriquement, char, int et long pourraient tous être de 1 octet, auquel cas ilCHAR_BIT
doit être d'au moins 32. Rappelez-vous simplement que "byte" a toujours la taille d'un char, donc si char est plus grand, un octet n'est pas seulement de 8 bits. plus.la source
byte
type de données existe en C ++. Ce n'est pas le cas, n'est-ce pas? Si c'est le cas, et qu'unbyte
peut avoir d'autres tailles que 8 bits, c'est purement stupide. Pourquoi l'appelleraient-ils un octet à moins qu'il ne s'agisse absolument nécessairement de 8 bits?Cela dépend de votre compilateur. Vous avez la garantie qu'un long sera au moins aussi grand qu'un int, mais vous n'êtes pas assuré qu'il le sera plus longtemps.
la source
Pour la plupart, le nombre d'octets et la plage de valeurs sont déterminés par l'architecture du processeur et non par C ++. Cependant, C ++ définit des exigences minimales, que litb a bien expliqué et Martin York n'a commis que quelques erreurs avec.
La raison pour laquelle vous ne pouvez pas utiliser int et long de manière interchangeable est qu'ils ne sont pas toujours de la même longueur. C a été inventé sur un PDP-11 où un octet avait 8 bits, int était de deux octets et pouvait être manipulé directement par des instructions matérielles. Étant donné que les programmeurs C avaient souvent besoin d'arithmétique sur quatre octets, long a été inventé et il était de quatre octets, géré par des fonctions de bibliothèque. D'autres machines avaient des spécifications différentes. La norme C imposait des exigences minimales.
la source
S'appuyer sur l'implémentation par le fournisseur du compilateur des tailles de types primitifs reviendra vous hanter si jamais vous compilez votre code sur une autre architecture de machine, un autre système d'exploitation ou un compilateur d'un autre fournisseur.
La plupart des fournisseurs de compilateurs fournissent un fichier d'en-tête qui définit les types primitifs avec des tailles de type explicites. Ces types primitifs doivent être utilisés chaque fois que du code peut être potentiellement porté vers un autre compilateur (lisez ceci comme TOUJOURS dans CHAQUE instance). Par exemple, la plupart des compilateurs UNIX ont
int8_t uint8_t int16_t int32_t uint32_t
. Microsoft aINT8 UINT8 INT16 UINT16 INT32 UINT32
. Je préfère Borland / CodeGearint8 uint8 int16 uint16 int32 uint32
. Ces noms donnent également un petit rappel de la taille / plage de la valeur prévue.Pendant des années, j'ai utilisé les noms de types primitifs explicites de Borland et
#include
le fichier d'en-tête C / C ++ suivant (primitive.h) qui est destiné à définir les types primitifs explicites avec ces noms pour tout compilateur C / C ++ (ce fichier d'en-tête peut ne pas couvrir tous les compilateur mais il couvre plusieurs compilateurs que j'ai utilisés sous Windows, UNIX et Linux, il ne définit pas (encore) les types 64 bits).la source
Le standard C ++ le dit comme ceci:
3.9.1, §2:
La conclusion: cela dépend de l'architecture sur laquelle vous travaillez. Toute autre hypothèse est fausse.
la source