La norme C++ ne précise pas la taille des types intégraux en octets, mais elle spécifie les plages minimales qu'ils doivent pouvoir contenir. Vous pouvez déduire la taille minimale en bits à partir de la plage requise. Vous pouvez déduire la taille minimale en octets à partir de cette plage et de la valeur de l'attribut CHAR_BIT
macro qui définit le nombre de bits dans un octet . Dans toutes les plateformes, sauf les plus obscures, c'est 8, et ça ne peut pas être moins que 8.
Une contrainte supplémentaire pour char
est que sa taille est toujours de 1 octet, soit CHAR_BIT
bits (d'où le nom). Cela est indiqué explicitement dans la norme.
La norme C est une référence normative pour la norme C++. Ainsi, même s'il n'énonce pas ces exigences de manière explicite, le C++ exige des plages minimales requis par la norme C (page 22), qui sont les mêmes que ceux de Data Type Ranges sur MSDN :
-
signed char
-127 à 127 (attention, pas -128 à 127 ; cela correspond aux plateformes de complément à 1 et de signe et magnitude)
-
unsigned char
: 0 à 255
- "simple"
char
: même gamme que signed char
o unsigned char
, définie par la mise en œuvre
-
signed short
: -32767 à 32767
-
unsigned short
: 0 à 65535
-
signed int
: -32767 à 32767
-
unsigned int
: 0 à 65535
-
signed long
: -2147483647 à 2147483647
-
unsigned long
: 0 à 4294967295
-
signed long long
: -9223372036854775807 à 9223372036854775807
-
unsigned long long
: 0 à 18446744073709551615
Une implémentation C++ (ou C) peut définir la taille d'un type en octets. sizeof(type)
à n'importe quelle valeur, tant que
- l'expression
sizeof(type) * CHAR_BIT
est évalué à un nombre de bits suffisamment élevé pour contenir les plages requises, et
- l'ordre des types est toujours valable (par ex.
sizeof(int) <= sizeof(long)
).
En mettant tout cela ensemble, nous sommes assurés que :
-
char
, signed char
et unsigned char
sont au moins de 8 bits
-
signed short
, unsigned short
, signed int
et unsigned int
sont au moins de 16 bits
-
signed long
et unsigned long
sont au moins de 32 bits
-
signed long long
et unsigned long long
sont au moins de 64 bits
Aucune garantie n'est donnée quant à la taille des float
o double
sauf que double
fournit au moins autant de précision que float
.
Les plages spécifiques à l'implémentation peuvent être trouvées dans <limits.h>
en C, ou <climits>
en C++ (ou encore mieux, des modèles std::numeric_limits
sur <limits>
en-tête).
Par exemple, c'est ainsi que vous trouverez la portée maximale pour int
:
C :
#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;
C++ :
#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();
23 votes
@thyrgle ce n'est pas par choix... il y a tellement d'architectures à supporter qu'il faut être flexible.
6 votes
Voir : stackoverflow.com/questions/271076/
6 votes
Pourquoi ne pas supprimer tous les types vagues et normaliser le tout avec des types de longueur de bit définis, par exemple int32_t, uint32_t, int64_t, etc.
6 votes
@thyrgle Il est en fait assez difficile de normaliser quelque chose comme ça. Contrairement à Java, où ces choses sont constantes en raison du fonctionnement de la JVM, le C/C++ doit essentiellement s'en tenir au système sur lequel il est exécuté sans aucune couche d'abstraction fantaisiste (du moins pas autant qu'avec Java) entre les deux. Si la taille de l'int est si importante, on peut utiliser
int16_t
,int32_t
etint64_t
(besoin de laiostream
pour cela si je me souviens bien). Ce qui est bien avec cela, c'est que int64_t ne devrait pas avoir de problèmes sur un système 32bit (cela aura un impact sur les performances cependant).10 votes
@rbaleksandar Ils sont en fait définis dans
<cstdint>
no<iostream>
.0 votes
Bien que le PO demande spécifiquement les nombres à virgule flottante, aucune des réponses n'en parle...