/* File: tipiarit.c */ /* Time-stamp: "2001-03-20 12:35:42 calvanes" */ /* Scopo: i tipi aritmetici predefiniti del C */ #include <stdio.h> #include <limits.h> #include <float.h> int main(void) { short si; /* intero con segno che occupa sizeof(short) byte*/ int i; /* intero con segno che occupa sizeof(int) byte */ long li; /* intero con segno che occupa sizeof(long) byte*/ unsigned short us; /* intero senza segno - sizeof(unsigned short) byte */ unsigned int ui; /* intero senza segno - sizeof(unsigned int) byte */ unsigned long ul; /* intero senza segno - sizeof(unsigned long) byte */ char ch; /* carattere, occupa sizeof(char) byte*/ float f; /* reale in singola precisione, occupa sizeof(float) byte*/ double d; /* reale in doppia precisione, occupa sizeof(double) byte*/ long double ld; /* reale in quadrupla precisione, occupa sizeof(long double) byte */ /* All'aumentare dello spazio occupato aumenta l'intervallo di defizione dei numeri rappresentati. Il C non definisce l'occupazione di memoria corrispondente ai vari tipi. Definisce solo le seguenti relazioni: sizeof(short) <= sizeof(int) <= sizeof(long) sizeof(short) >= 2 sizeof(long) >= 4 sizeof(unsigned short) = sizeof(short) sizeof(unsigned int) = sizeof(int) sizeof(unsigned long) = sizeof(long) sizeof(float) <= sizeof(double) <= sizeof(long double) */ /* Letterali */ si = 10; /* per gli interi si utilizza la notazione decimale */ i = -100; li = 1000; i = 0xf; /* e' anche possibile utilizzare la notazione esadecimale */ i = 01; /* o ottale */ us = 10; /* per gli interi senza senza segno si utilizza la notazione */ ui = 100; /* decimale */ ul = 1000; ui = 0xf; /* e' anche possibile utilizzare la notazione esadecimale */ ui = 01; /* o ottale */ ch = 'a'; /* per i caratteri su utilizza la notazione 'carattere' */ d = 1.0; /* per i reali si utilizza la notazione con punto decimale */ d = 1.0e10; /* o la notazione esponenziale */ f = 1.0f; /* si noti che per denotare letterali float si puo` */ f = 1.0e10f; /* aggiungere la 'f' (o 'F') finale. */ ld = 1.0L; /* si noti che per denotare letterali long double si puo' */ ld = 1.0e10L; /* aggiungere la 'L' (o 'l') finale. */ /* Conversioni: le conversioni "sicure" (cioe` che hanno il risultato atteso) sono le seguenti short -> int -> long -> float -> double -> long double char -> int Accettando che possano verificarsi errori e` possibile invertire le conversioni di cui sopra. */ ld = 100.00; d = ld; f = d; li = f; i = li; si = i; ch = i; si = ch; ch = si; /* Standard output */ printf("%hd\n", si); /* accettabile anche printf("%d\n", si); */ printf("%d\n", i); printf("%ld\n", li); /* accettabile anche printf("%d\n", li); */ printf("%c\n", ch); printf("%g\n", f); /* modo piu` semplice tra notazione con punto */ printf("%g\n", d); /* decimale e notazione scientifica */ printf("%Lg\n", ld); printf("%f\n", f); /* notazione con punto decimale */ printf("%f\n", d); printf("%Lf\n", ld); printf("%e\n", f); /* notazione scientifica */ printf("%e\n", d); printf("%Le\n", ld); /* Standard input */ printf("Inserire short: "); scanf("%hd", &si); printf("%hd\n", si); printf("Inserire int: "); scanf("%d", &i); printf("%d\n", i); printf("Inserire long: "); scanf("%ld", &li); /* accettabile anche scanf("%d", &li); */ printf("%ld\n", li); printf("Inserire unsigned short: "); scanf("%hu", &us); printf("%hu\n", us); printf("Inserire unsigned int: "); scanf("%u", &ui); printf("%u\n", ui); printf("Inserire unsigned long: "); scanf("%lu", &ul); /* accettabile anche scanf("%ud", &ul); */ printf("%lu\n", ul); getchar(); /* legge a vuoto il carattere corrisondente ad a capo */ printf("Inserire char: "); scanf("%c", &ch); printf("%c\n", ch); printf("Inserire float: "); scanf("%g", &f); /* oppure %e o %f */ printf("%g\n", f); printf("Inserire double: "); scanf("%lg", &d); /* oppure %e o %f */ printf("%g\n", d); printf("Inserire long double: "); scanf("%Lg", &ld); /* oppure %e o %f */ printf("%Lg\n", ld); }