Les normes ne disent rien concernant la taille exacte des types entiers à part char
. Typiquement, long
est 32 bits sur les systèmes 32 bits et 64 bits sur les systèmes 64 bits.
La norme spécifie cependant un minimum Taille. Extrait de la section 5.2.4.2.1 de la norme C :
1 Les valeurs données ci-dessous doivent être remplacées par des expressions constantes utilisables en
#if
directives de prétraitement. De plus, sauf pourCHAR_BIT
etMB_LEN_MAX
, les éléments suivants doivent être remplacés par des expressions qui ont le même type que le serait une expression qui est un objet du type correspondant converti selon les promotions entières. Leurs valeurs définies par la mise en œuvre doivent être égales ou supérieures en amplitude (valeur absolue) à celles indiquées, avec le même signe....
valeur minimale pour un objet de type
long int
LONG_MIN
-2147483647 // −(2^31−1)valeur maximale pour un objet de type
long int
LONG_MAX
+2147483647 // 2^31−1
Cela dit qu'un long int
doit être un minimum de 32 bits, mais peut être plus grand. Sur une machine où CHAR_BIT
est de 8, cela donne une taille d'octet minimale de 4. Cependant, sur une machine avec par ex. CHAR_BIT
égal à 16, un long int
peut avoir une longueur de 2 octets.
Voici un exemple concret. Pour le code suivant :
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Sortie sur Debian 7 i686 :
sizeof(long) =4
Sortie sur CentOS 7 x64 :
sizeof(long) =8
Donc non, vous ne pouvez pas faire d'hypothèses sur la taille. Si vous avez besoin d'un type d'une taille spécifique, vous pouvez utiliser les types définis dans stdint.h
. Il définit les types suivants :
int8_t
:8 bits signéuint8_t
:8 bits non signéint16_t
:16 bits signéuint16_t
:16 bits non signéint32_t
:32 bits signéuint32_t
:32 bits non signésint64_t
:64 bits signésuint64_t
:64 bits non signés
Le stdint.h
header est décrit dans la section 7.20 de la norme, avec les types de largeur exacte dans la section 7.20.1.1. La norme stipule que ces typedefs sont facultatifs, mais ils existent sur la plupart des implémentations.
Non, ni le standard C ni POSIX ne le garantissent et en fait la plupart des plates-formes 64 bits de type Unix ont un long
64 bits (8 octets) .