Gli standard non dicono nulla in merito alla dimensione esatta di qualsiasi tipo intero a parte char
. Tipicamente, long
è a 32 bit su sistemi a 32 bit e a 64 bit su sistemi a 64 bit.
Lo standard tuttavia specifica un minimo taglia. Dalla sezione 5.2.4.2.1 dello Standard C:
1 I valori forniti di seguito devono essere sostituiti da espressioni costanti adatte all'uso in
#if
direttive di preelaborazione. Inoltre, ad eccezione diCHAR_BIT
eMB_LEN_MAX
, quanto segue deve essere sostituito da espressioni che hanno lo stesso tipo di un'espressione che è un oggetto del tipo corrispondente convertito in base alle promozioni intere. I loro valori definiti dall'implementazione devono essere uguali o maggiori in grandezza (valore assoluto) a quelli mostrati, con lo stesso segno....
valore minimo per un oggetto di tipo
long int
LONG_MIN
-2147483647 // −(2^31−1)valore massimo per un oggetto di tipo
long int
LONG_MAX
+2147483647 // 2^31−1
Questo dice che un long int
deve essere un minimo di 32 bit, ma può essere maggiore. Su una macchina in cui CHAR_BIT
è 8, questo fornisce una dimensione minima in byte di 4. Tuttavia su macchine con ad es. CHAR_BIT
uguale a 16, un long int
potrebbe essere lungo 2 byte.
Ecco un esempio del mondo reale. Per il seguente codice:
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Output su Debian 7 i686:
sizeof(long) =4
Uscita su CentOS 7 x64:
sizeof(long) =8
Quindi no, non puoi fare ipotesi sulle dimensioni. Se hai bisogno di un tipo di una dimensione specifica, puoi utilizzare i tipi definiti in stdint.h
. Definisce i seguenti tipi:
int8_t
:firmato a 8 bituint8_t
:8 bit senza segnoint16_t
:firmato a 16 bituint16_t
:16 bit senza segnoint32_t
:firmato a 32 bituint32_t
:32 bit senza segnoint64_t
:firmato a 64 bituint64_t
:64 bit senza segno
Il stdint.h
l'intestazione è descritta nella sezione 7.20 dello standard, con tipi di larghezza esatti nella sezione 7.20.1.1. Lo standard afferma che questi typedef sono facoltativi, ma esistono nella maggior parte delle implementazioni.
No, né lo standard C né POSIX lo garantiscono e infatti la maggior parte delle piattaforme a 64 bit simili a Unix ha un long
a 64 bit (8 byte) .