Appunti su formati numerici
Tipi numerici Il C dispone di due tipi numerici: tipi interi e tipi reali; I tipi reali sono anche detti floating, ovvero a virgola “mobile”; essi hanno una parte intera e una decimale (frazionale) I tipi interi, a loro volta, si dividono in due categorie: con segno (signed) e senza segno (unsigned).
Interi con segno e senza segno Il bit più a sinistra di un intero con segno (conosciuto come il bit del segno) e’ 0 se il numero e’ positivo o zero, 1 se e’ negativo. Il più grande intero con segno a 16 bit ha per rappresentazione binaria , che vale 32,767 (2 15 – 1). Il più grande intero con segno a 32 bit ha per rappresentazione binaria che vale 2,147,483,647 (2 31 – 1). Un intero senza segno (unsigned) non ha il bit che rappresenta il segno: diventa così possibile rappresentare più valori positivi. Il più grande intero senza segno a 16 bit e’ 65,535 (2 16 – 1). Il più grande intero senza segno a 32 bit e’ 4,294,967,295 (2 32 – 1).
Interi con segno e senza segno Per default, i tipi hanno un segno in C, ovvero il bit più a sinistra viene usato per rappresentare il segno; Per indicare che vogliamo un tipo senza segno dobbiamo premettere la parola riservata unsigned alla dichiarazione; I tipi senza segno sono utili nei programmi in cui vogliamo ottimizzare l’utilizzo della memoria.
Tipi interi Il tipo int occupa di solito 32 bit (16 bit su vecchi computer); E’ possibile creare interi piu’ lunghi o piu’ corti, sempre con l’intento di ottimizzare l’utilizzo della memoria premettendo, rispettivamente, le parole riservate long e short; Sono quindi disponibili sei diversi tipi di interi: short intunsigned short int intunsigned int long intunsigned long int
TipoValore piu’ piccoloValore piu’ grande ( 16 bit) short int –32,768 32,767 unsigned short int 065,535 int –32,768 32,767 unsigned int 0 65,535 long int –2,147,483,6482,147,483,647 unsigned long int 04,294,967,295 Tipo (32 bit) short int –32,768 32,767 unsigned short int 0 65,535 int –2,147,483,6482,147,483,647 unsigned int 0 4,294,967,295 long int –2,147,483,6482,147,483,647 unsigned long int 0 4,294,967,295
Tipi reali Il C fornisce tre tipi reali, in relazione alla lunghezza della parte decimale che puo’ essere rappresentata e di conseguenza alla precisione che puo’ essere raggiunta: – float precisione singola – double precisione doppia – long double precisione estesa
Tipi Reali Tipovalore più piccolo rappresentabile valore più grande rappresentabile float 10 – double 10 –
Costanti di tipo reale Il numero 57 può essere scritto in diversi modi: e0 57E0 5.7e1 5.7e+1.57e2 570.e-1 Una costante reale deve contenere il punto decimale (la virgola italiana); l’esponente indica la potenza di 10 per la quale il numero deve essere scalato; Se un esponente e’ presente, esso deve essere preceduto dalla lettera E (oppure e ). Un segno opzionale (+ o -) puo’ apparire dopo la E ( e ); Una costante viene memorizzata in formato a precisione doppi; Per indicare che una costante deve essere memorizzata in formato a precisione estesa ( long double ) viene premessa la lettera L (oppure l ) alla fine (esempio: 57.0L ).
Lettura e scrittura di numeri reali Le direttive di formattazione %e, %f e %g sono usate per leggere e scrivere (attraverso scanf e printf ) numeri reali a singola precisione; Per leggere un valore a doppia precisione bisogna premettere una l di fronte alla %e, %f e %g ; double d; scanf("%lf", &d); Nota: l va usata solo per la lettura ( scanf ) e non per la scrittura ( printf ); In una stringa di formattazione in una printf, le direttive di formattazione %e, %f e %g valgono sia per valori a singola che a doppia precisione; La lettera L deve essere infine premessa a %e, %f e %g per leggere e scrivere tipi a precisione estesa;