#include <math.h>

      int main()
      {
       long long int minimum = 0;
       long long int maximum = 0;

       short s;
       unsigned short us;
       int i;
       unsigned int ui;
       long int li;
       unsigned long int uli;
       long long int lli;
       unsigned long long int ulli;

       // Pour un chiffre signe, un bit est reserve au signe, le maximum est donc
       // 2 exposant ( nombre de bits-1 )
       // le nombre de bits est le nombre d'octets de la variable ( sizeof ) *8
       // car il y a 8 bits dans un octet
       // On utilise la fonction pow() pour calculer l'exposant, cette fonction
       // accepte deux doubles en parametre, on transforme donc nos valeurs
       // en doubles le temps de la fonction, et on retransforme le resultat ensuite.
       maximum = ( long long int )pow( (double)2, (double)(sizeof(short)*8)-1 )-1;
       printf(" maximum short = %d\n", maximum );
       s=maximum;
       printf("s maximum = %d\n", ( int ) s );
       s++;
       printf("et si on AJOUTE 1 : s = %d\n", ( int ) s );
       minimum = s;
       printf(" minimum short = %d\n", minimum );
       printf("\n");

       // Pour un chiffre non signe, tous les bits de la variable sont utilises
       // pour la valeur.
       // Le nombre de bits est donc ( taille de la variable en octets * 8 )
       maximum = ( long long int )pow( (double)2, (double)(sizeof(short)*8) )-1;
       printf(" maximum unsigned short = %d\n", maximum );
       us=maximum;
       printf("us maximum = %d\n", ( int ) us );
       us++;
       printf("et si on AJOUTE 1 : us = %d\n", ( int ) us );
       minimum = us;
       printf(" minimum unsigned short = %d\n", minimum );
       printf("\n");

       maximum = ( long long int )pow( (double)2, (double)(sizeof(int)*8)-1 )-1;
       printf(" maximum int = %d\n", maximum );
       i=maximum;
       printf("i maximum = %d\n", i );
       i++;
       printf("et si on AJOUTE 1 : i = %d\n", i );
       minimum = i;
       printf(" minimum int = %d\n", i );
       printf("\n");

       ui=0;
       minimum = (long long int)ui;
       printf(" minimum unsigned int = %ld\n", ( long int )ui );
       // si on enleve 1 a 0, on arrive au maximum car une valeur
       // negative n est pas possible
       ui--;
       maximum = (long long int)ui;
       printf(" maximum unsigned int = %u\n", ( long int )ui );

       li= pow( (double)2, (double)(sizeof(long int)*8)-1 )-1;
       printf(" maximum long int = %ld\n", li );
       // si on ajoute 1 au maximum, on arrive au minimum
       li++;
       printf(" minimum long int = %ld\n", li );

       uli= pow( (double)2, (double)(sizeof(long int)*8) )-1;
       printf(" maximum unsigned long int = %u\n", uli );
       uli++;
       printf(" minimum unsigned long int = %u\n", uli );

       lli= pow( (double)2, (double)(sizeof(long long int)*8)-1 )-1;
       printf(" maximum long long int = %lld\n", lli );
       lli++;
       printf(" minimum long long int = %lld\n", lli );

       ulli=0;
       printf(" minimum unsigned long long int = %llu\n", ulli );
       // si on enleve 1 a 0, on arrive au maximum car une valeur
       // negative n est pas possible
       ulli--;
       printf(" maximum unsigned long long int = %llu\n", ulli );

       return(1);
      }
