Possono essere qualsiasi dimensione scrittore compilatore voluto, soggetta ad essi essendo almeno grande quanto il loro tipo predecessore (long int
per long long int
e int
per long int
) e soddisfare gli intervalli minimi stabiliti dalle norme.
Vedi, per esempio, 5.2.4.2 Numerical limits
in C11, in cui si afferma la gamma minima richiesta:
long int
LONG_MIN -2147483647 // −(2^31 − 1)
LONG_MAX +2147483647 // 2^31 − 1
long long int
LLONG_MIN -9223372036854775807 // −(2^63 − 1)
LLONG_MAX +9223372036854775807 // 2^63 − 1
Si noti che questi non sono la vostra gamma completa complemento due di quanto devono tenere conto per l'altro anche due schemi di codifica, il complemento e la grandezza del segno, entrambi con il concetto di zero negativo.
Se si vuole veramente sapere, si può solo guardare quei valori nel file limits.h
intestazione, o compilare ed eseguire:
#include <stdio.h>
#include <limits.h>
int main (void) {
printf ("BITS/CHAR %d\n", CHAR_BIT);
printf ("CHARS/SHORT %d\n", sizeof(short));
printf ("CHARS/INT %d\n", sizeof(int));
printf ("CHARS/LONG %d\n", sizeof(long));
printf ("CHARS/LLONG %d\n", sizeof(long long));
putchar ('\n');
printf ("SHORT MIN %d\n", SHRT_MIN);
printf ("SHORT MAX %d\n", SHRT_MAX);
printf ("INT MIN %d\n", INT_MIN);
printf ("INT MAX %d\n", INT_MAX);
printf ("LONG MIN %ld\n", LONG_MIN);
printf ("LONG MAX %ld\n", LONG_MAX);
printf ("LLONG MIN %lld\n", LLONG_MIN);
printf ("LLONG MAX %lld\n", LLONG_MAX);
return 0;
}
Sul mio sistema, uno abbastanza bog-standard (e un po 'riformattato a guardare piuttosto):
BITS/CHAR 8
CHARS/SHORT 2
CHARS/INT 4
CHARS/LONG 4
CHARS/LLONG 8
SHORT MIN -32768
SHORT MAX 32767
INT MIN -2147483648
INT MAX 2147483647
LONG MIN -2147483648
LONG MAX 2147483647
LLONG MIN -9223372036854775808
LLONG MAX 9223372036854775807
Quindi sembra che, su questo sistema, ho complemento a due (il 8/7
disadattamento sul l'ultima cifra dei numeri negativi/positivi), nessun bit di imbottitura, a 16 bit short int
, 32 -bit int
e long int
e 64-bit long long int
.
Se si esegue un codice simile nel proprio ambiente, dovrebbe essere in grado di fornirvi informazioni simili.
C'è un secondo vincolo sulla dimensione di 'long long': deve essere di almeno 64 bit. Questo è garantito dallo standard C. – cmaster
@ cmaster: in realtà, la frase "64 bit" è vista solo tre volte in C11, due volte in relazione al formato a virgola mobile IEC 60559 e una volta per i tipi di interi a larghezza esatta. Non viene menzionato affatto per i normali tipi interi sebbene sia possibile estrapolare gli intervalli (che * sono * specificati) per assumere 64 bit richiesti. Ma sono gli * intervalli * che sono specificati specificamente piuttosto che la larghezza. Certo, potrei sbagliarmi, non sarebbe la prima volta. Ma avrei bisogno di una citazione dello standard per convincermi :-) – paxdiablo
@paxdiablo: Il C11 definisce _bit_ in §3.5 come unità, che è abbastanza grande da contenere due valori. Cita anche il termine _mathematically defined_ in §6.5/p5. Con la matematica pura, è possibile memorizzare esattamente i valori unici '2^n' nell'entità' n'-bit, L'intervallo _minimum_ di 'long long int' implica 'abs (LLONG_MIN) + LLONG_MAX + 1' valori univoci (extra uno per zero). Il risultato di 'ceil (log2 (abs (LLONG_MIN) + LLONG_MAX + 1))' è 64, quindi è la _minimum_ width in bit per quel tipo. Si noti che questo non è necessariamente necessario otto byte, poiché 'CHAR_BIT' è definito dall'implementazione e può essere diverso da otto. –