Traduzioni di questa pagina?:

C++ Data Types

Il C contempla cinque tipi dati di base: void, int, float, double, and char.

TypeDescription
voidnessuna rappresentazione associata
intnumeri interi
floatnumeri in virgola mobile (floating-point) a singola precisione
doublenumeri in virgola mobile a doppia precisione
charcaratteri

Oltre a questi il C++ ne definisce altri due: bool e wchar_t.

TypeDescription
boolValore booleano quindi true (vero) o false (falso)
wchar_twide char, carattere esteso per rappresentazione di simboli di alfabeti non latini

Type Modifiers

Alcuni di questi tipi di dati possono essere modificati usando le parole riservate signed, unsigned, short e long. Quando uno di questi modificatori viene usato a se state il compilatore assume che ci si riferisca ad un int. Ecco una lista di possibili data-type (tipi equivalenti vengono mostrati sulla stessa riga):

numeri interi
bool
char
signed char
unsigned char
wchar_t
shortshort intsigned shortsigned short int
unsigned shortunsigned short int
intsignedsigned int
unsignedunsigned int
longlong intsigned longsigned long int
unsigned longunsigned long int
numeri a virgola mobile (floating point types)
float
double
long double
tipi di interi talvolta supportati
long longlong long intsigned long longsigned long long int
unsigned long longunsigned long long int

Tipo dati, dimensioni e range di valori

La dimensione e il range di valori di qualsiasi tipo di dati è dipendente dall'architettura della macchina e dal compilatore. Potete usare l'operatore sizeof per determinare la dimensione di qualsiasi tipo di dati (spesso espresso come numero di byte). Molte architetture tuttavia implementano dati con un dimensione standard. Spesso variabili dichiarate come int o float sono a 32 bit, i char sono a 8 bit e double sono a 64 bit. Le variabili bool sono spesso realizzate a 8 bit e gli interi long long a 64 bit. L'header “cfloat” (o “float.h”) definisce i range per i numeri in virgola mobile, mentre “climits” (o “limits.h”) defisce il range per gli interi.

I limite dei valori numerici sono nell'header <limits>. I “templated values” di numeric_limits fornisce rappresentazioni numeriche dipendenti dal sistema dei tipi di dati usati nel C++. Usate la funzione approriata, tra quelle elencate, e un certo tipo dati come argomento del template. Notare che di numeric_limits si può fare l'overload per tipi di dati definiti dal programmatore.

Metodo o
constante
ReturnDescrizione
is_specializedbool
radixintbase of exponent
digitsintnumber of radix digits in mantissa
digits10intnumber of base 10 digits in mantissa
is_signedbool
is_integerbool
is_exactbool
min()<type>smallest number that can be respresented (not the most negative)
max()<type>largest number
epsilon()<type>inherent representation error value
round_error()<type>maximum rounding adjustment possible
infinity()<type>
quiet_NaN()<type>invalid number that does not signal floating point error
signaling_NaN()<type>invalid number that signals floating point error
denorm_min()<type>
min_exponentint
min_exponent10int
max_exponentint
max_exponent10int
has_infinitybool
has_quiet_NaNbool
has_signaling_NaNbool
has_denorm<type>_denorm_style
has_denorm_lossbool
is_iec559boolconforms to IEC-559
is_boundedbool
is_modulobool
trapsbool
tinyness_beforebool
round_stylefloat_round_style { round_to_nearest, … }

L'uso più frequente è quello del controllo dei limiti per determinare il valore massimo o minimo che un tipo dati può contenere. Il codice seguente stampa i valori minini e massimi per un dato dichiarato come short.

  #include <limits>
  std::cout << "Maximum short value: " << std::numeric_limits<short>::max() << std::endl;
  std::cout << "Minimum short value: " << std::numeric_limits<short>::min() << std::endl;

Interpretazione delle dichiarazioni di data type

Interpretare una dichiarazione è solitamente intuitivo.

  int i

definisce una variabile intera con segno.

Tuttavia può essere compliato cercare di interpretare dichiarazione di data type più complicate:

  double **d[8]              // hmm...
  char *(*(**foo [][8])())[] // Cos'è 'foo'?

Potete costruire il significato delle dichiarazioni appena mostrate usando queste 3 regole:

  1. Iniziate la dichiarazione con nome della variabile (d o foo negli esempi citati)
  2. Finite la dichiarazione con il tipo di dato (double o char)
  3. Completate la parte interna muovendovi a destra quando possibile, altrimenti a sinistra quando dovete. (Le parentesi potrebbero costringervi a procedere verso sinistra.)

Esempio:

EspressioneSignificato
double **d[8];
double **d[8]; d è … double
double **d[8]; d è un array of 8 … double
double **d[8]; d è un array di 8 puntatori a … double
double **d[8]; d è un array di 8 puntatori verso puntatori di double

Altro esempio:

ExpressionMeaning
char *(*(**foo [][8])())[]
char *(*(**foo [][8])())[] foo is … char
char *(*(**foo [][8])())[] foo is an array of … char
char *(*(**foo [][8])())[] foo is an array of an array of 8 … char
char *(*(**foo [][8])())[] foo is an array of an array of 8 pointer to … char
char *(*(**foo [][8])())[] foo is an array of an array of 8 pointer to pointer to … char
char *(*(**foo [][8])())[] foo is an array of an array of 8 pointer to pointer to function returning … char
char *(*(**foo [][8])())[] foo is an array of an array of 8 pointer to pointer to function returning pointer to … char
char *(*(**foo [][8])())[] foo is an array of an array of 8 pointer to pointer to function returning pointer to array of … char
char *(*(**foo [][8])())[] foo is an array of an array of 8 pointer to pointer to function returning pointer to array of pointer to char

Per una spiegazione più dettagliata andate alla descrizione di Steve Friedl's su come leggere dichiarazioni in C alla pagina http://www.unixwiz.net/techtips/reading-cdecl.html.