è int di default long int in C?

Perché trovo che le dimensioni di int e long int siano di 4 byte? È che l’int è di default lungo int?

 sizeof(short) <= sizeof(int) <= sizeof(long) 

Questo è tutto ciò su cui puoi contare. Il resto è completamente in fase di implementazione. Nei vecchi tempi di DOS, i compilatori a 16 bit di solito ha sizeof (int) == sizeof (short) == 2. Su sistemi a 32 bit, sizeof (int) è solitamente uguale a sizeof (long) == 4. Come regola of thumb, int è il tipo con cui il processore può funzionare più velocemente. Nessuna regola senza eccezioni ...

EDIT: Rimosso la seconda regola, sizeof(short) < sizeof(long) , che NON fa parte dello standard C. Su alcune piattaforms, sizeof(short) può essere effettivamente uguale a sizeof(long) .

La dimensione di int non è né garantita per essere 4 né essere uguale alla dimensione di long int . In altre parole: è completamente definito l’implementazione.

Hanno solo la stessa dimensione.

Questo post riassume ciò che puoi aspettarti dai tipi di dati per quanto riguarda le dimensioni e l’intervallo.

No, int e long non sono necessariamente della stessa dimensione, anche se ciò accade nel tuo compilatore.

Lo standard C definisce una dimensione minima per ciascuno di questi tipi di dati, ma dipende dall’implementazione di quale sia la dimensione effettiva. Ad esempio, alcuni sistemi hanno int byte da 2 byte e s byte long 4 byte, mentre altri possono avere ints da 4 byte e s da 8 byte.

Le uniche garanzie sono le mandate standard (supponiamo che tutte le espressioni seguenti siano sizeof (type) invece di solo type )

 char <= short <= int <= long <= long long 

così puoi avere

 char == short == int == long == long long /* Cray?? */ char < short < int == long < long long /* Windows 32 bit */ char < short < int < long == long long /* Linux 64 bit */ 

L’unica garanzia offerta dallo standard è quella sizeof (long)> = sizeof (int).

Nei vecchi tempi dei processori a 16 bit, non era raro che int fosse di 2 byte.

Lo standard C fornisce le seguenti garanzie sui ranghi di conversione dei tipi interi standard e delle loro precisioni:

 _Bool (1) < char (8) <= short (16) <= int (16) <= long (32) <= long long (64) 

In caso di _Bool , la precisione è esatta, mentre gli altri sono valori minimi. Potrebbero inoltre esserci ulteriori tipi di intero esteso cosiddetti.

Un char è la più piccola unità di memoria indirizzabile, quindi sizeof (char) == 1 , indipendentemente dalla sua precisione (che è data da CHAR_BIT ). Le dimensioni degli altri tipi di interi standard sono definite dall'implementazione. Sospetto che sizeof (_Bool) sarà anch'esso 1 , ma non sono riuscito a trovare nulla nello standard che in realtà garantisce questo ...

Nei moderni sistemi operativi a 32 bit, int e long sono generalmente a 32 bit o ILP32 (intero, lungo, puntatore), mentre su sistemi operativi a 64 bit, LP64 è comune, il che implica che int è a 32 bit. lungo è lungo 64 bit quasi ovunque, che può essere o non essere uguale a lungo.

Di solito ci sono macro che puoi testare, come ILP32, ILP32 , ecc. Che saranno impostate se il tuo ambiente usa quel tipo di tipi.