/* 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);
}