C Language Tipi interi e costanti


Esempio

Gli interi firmati possono essere di questi tipi (l' int dopo l' short o l'opzione long è facoltativo):

signed char c = 127; /* required to be 1 byte, see remarks for further information. */
signed short int si = 32767; /* required to be at least 16 bits. */
signed int i = 32767; /* required to be at least 16 bits */
signed long int li = 2147483647; /* required to be at least 32 bits. */
C99
signed long long int li = 2147483647; /* required to be at least 64 bits */

Ognuno di questi tipi di interi con segno ha una versione senza firma.

unsigned int i = 65535;
unsigned short = 2767;
unsigned char = 255;

Per tutti i tipi, ma char la signed versione si presume se il signed o unsigned parte viene omesso. Il tipo char costituisce un terzo tipo di carattere, diverso dal signed char e dal signed char unsigned char e la signness (o meno) dipende dalla piattaforma.

Diversi tipi di costanti intere (chiamate letterali in C jargon) possono essere scritti in basi diverse e larghezza diversa, in base al loro prefisso o suffisso.

/* the following variables are initialized to the same value: */
int d = 42;   /* decimal constant (base10) */
int o = 052;  /* octal constant (base8) */
int x = 0xaf; /* hexadecimal constants (base16) */
int X = 0XAf; /* (letters 'a' through 'f' (case insensitive) represent 10 through 15) */

Le costanti decimali sono sempre signed . Le costanti esadecimali iniziano con 0x o 0X e le costanti ottali iniziano solo con uno 0 . Gli ultimi due sono signed o unsigned seconda che il valore si adatti al tipo firmato o meno.

/* suffixes to describe width and signedness : */
long int i = 0x32; /* no suffix represent int, or long int */
unsigned int ui = 65535u; /* u or U represent unsigned int, or long int */
long int li = 65536l; /* l or L represent long int */

Senza un suffisso la costante ha il primo tipo che si adatta al suo valore, cioè una costante decimale che è maggiore di INT_MAX è di tipo long se possibile, o long long altrimenti.

Il file di intestazione <limits.h> descrive i limiti degli interi come segue. I loro valori definiti dall'implementazione devono essere uguali o maggiori in grandezza (valore assoluto) a quelli mostrati sotto, con lo stesso segno.

macro genere Valore
CHAR_BIT l'oggetto più piccolo che non è un bit-field (byte) 8
SCHAR_MIN signed char -127 / - (2 7 - 1)
SCHAR_MAX signed char +127 / 2 7 - 1
UCHAR_MAX unsigned char 255/2 8 - 1
CHAR_MIN char vedi sotto
CHAR_MAX char vedi sotto
SHRT_MIN short int -32767 / - (2 15 - 1)
SHRT_MAX short int +32767 / 2 15 - 1
USHRT_MAX unsigned short int 65535/2 16 - 1
INT_MIN int -32767 / - (2 15 - 1)
INT_MAX int +32767 / 2 15 - 1
UINT_MAX unsigned int 65535/2 16 - 1
LONG_MIN long int -2147483647 / - (2 31 - 1)
LONG_MAX long int +2147483647 / 2 31 - 1
ULONG_MAX unsigned long int 4294967295/2 32 - 1
C99
macro genere Valore
LLONG_MIN long long int -9223372036854775807 / - (2 63 - 1)
LLONG_MAX long long int +9223372036854775807 / 2 63 - 1
ULLONG_MAX unsigned long long int 18446744073709551615/2 64 - 1

Se il valore di un oggetto di tipo char sign-extends quando utilizzato in un'espressione, il valore di CHAR_MIN deve essere uguale a quello di SCHAR_MIN e il valore di CHAR_MAX deve essere uguale a quello di SCHAR_MAX . Se il valore di un oggetto di tipo char non si estende al segno quando utilizzato in un'espressione, il valore di CHAR_MIN deve essere 0 e il valore di CHAR_MAX deve essere uguale a quello di UCHAR_MAX .

C99

Lo standard C99 ha aggiunto una nuova intestazione, <stdint.h> , che contiene definizioni per numeri interi a larghezza fissa. Vedere l'esempio intero a larghezza fissa per una spiegazione più approfondita.