I tipi scalari in C Input/output dei tipi scalari Conversioni di tipo Funzioni 5 Il sistema dei tipi C di dato Tipi Scalari Tipi Strutturati void Tipi eri Tipi reali Enumerazioni Vettori Strutture Union short / long signed/ long Puntatori Funzioni 7 I tipi eri in C Quanti bit? short long short long Descrizione Caratteri ASCII Interi con meno bit con più bit Interi senza segno con meno bit con più bit Esempi 'a' '7' '!' +2-18 +24221 1 423 234 Lo standard C non specifica l ampiezza, in bit, dei tipi di dato fondamentali L operatore sizeof può essere usato per ricavare una costante pari al numero di byte occupato da ciascun tipo sizeof( ) sizeof( ) 8 9
Specifiche del C Intervallo di rappresentazione sizeof( ) = 1 < sizeof(short short ) sizeof( ) sizeof(long ) = = = sizeof( short ) sizeof( ) sizeof( long ) short long short long Min CHAR_MIN INT_MIN SHRT_MIN LONG_MIN Max CHAR_MAX INT_MAX SHRT_MAX LONG_MAX UINT_MAX USHRT_MAX ULONG_MAX 1 #include <limits.h> 11 Compilatori a bit I tipi reali in C short long N. Bit 8 16 Min -128-2147483648 -768-2147483648 Max 127 2147483647 767 2147483647 long Descrizione Numeri reali in singola precisione Numeri reali in doppia precisione Numeri reali in massima precisione short long 16 4294967295 65536 4294967295 12 segno } 6 esponente 4748 ± eeeeee A = ± 1. 14243 mmmmm 2 mantissa 13 Numero di bit Intervallo di rappresentazione long Dimensione Mantissa bit 23 bit 64 bit 53 bit Esponente 8 bit 1 bit ±1.17549435E-38 ±3.4282347E+38 segno } 6 esponente 4748 ± eeeeee A = ± 1. 14243 mmmmm 2 mantissa ±2.2257385857214E-38 ±1.7976931348623157E+38 14 15
Input/output I diversi tipi scalari visti sono utilizzabili con le normali funzioni scanf/prf, adottando degli specifici indicatori di formato Utilizzando la funzione gets per l input, si possono usare le funzioni di conversione ato... 17 Specificatori di formato Funzioni di conversione short long short long scanf %c %[...] %d %hd %ld %u %o %x %hu %lu %f %lf prf %c %d %d %hd %d %ld %u %o %x %hu %lu %f %g %f %g line[8] ; x ; x = atoi(line) ; line[8] ; long x ; x = atol(line) ; line[8] ; x ; x = atof(line) ; line[8] ; x ; x = atof(line) ; 18 19 Conversioni di tipo (1/2) Nel linguaggio C è possibile combinare, nella stessa espressione, variabili di tipo diverso I due operandi di un operatore aritmetico possono avere tipi diversi a ; long b, c ; c = b + a ; prod ; v[n] ; prod = prod * v[i] ; 21
Conversioni di tipo (2/2) La variabile di destinazione di un assegnazione può avere tipo diverso dal tipo dell espressione a ; long b ; b = a ; prod ; v[n] ; prod = v[] ; logie di conversioni Per calcolare tali tipi di espressioni, il linguaggio C applica tre tipi di conversioni: Conversioni automatiche verso il tipo più capiente, basate sul principio di promozione del tipo Arrotondamenti e troncamenti, in caso di assegnazioni forzate a tipi meno capienti Conversioni esplicite, basate sull operatore di typecasting 22 23 Promozione del tipo Se i due operandi di un operatore aritmetico hanno tipo diverso, l operando del tipo più limitato viene convertito al tipo dell operando più esteso Promozione del tipo Se i due operandi di un operatore aritmetico hanno Non tipo si diverso, perde mai l operando precisione. del tipo più Il C converte automaticamente limitato viene convertito al tipo dell operando più verso i tipi più capienti esteso short long short long 24 25 Troncamento del risultato Conversioni esplicite Nell operatore di assegnazione var = expr ; ci possono essere 3 casi: La variabile destinazione ha lo stesso tipo dell espressione calcolata La variabile destinazione ha un tipo più ampio del tipo dell espressione calcolata Si promuove il tipo dell espressione al tipo della variabile destinazione La variabile destinazione ha un tipo più ristretto del tipo dell espressione calcolata Si approssima il tipo dell espressione al tipo della variabile destinazione, perdendo precisione 26 Qualora si vogliano modificare le regole predefinite di promozione e troncamendo dei tipi, il C mette a disposizione un operatore di conversione esplicita di tipo Typecasting (nuovotipo)expr Converte l espressione expr dal suo tipo nativo, al tipo desiderato nuovotipo Più capiente Meno capiente: troncamento o approssimazione 27
Esempio 1 Esempio 2 media ; somma, N ; media = somma / N ; /* no */ media = ( )somma / N ; voto ; parte1, parte2, parte3 ; voto = ( ) ((parte1 + parte2 + parte3)/3) ; 28 29 voto ; parte1, parte2, parte3 ; media ; /* arrotondamento all ero più vicino */ media = (parte1 + parte2 + parte3)/3 ; voto = ( ) (media +.5) ; Esempio 3 3