TP 16:Représentation des entiers relatifs

Expérience

   	
    int factorielle(int n){
    int produit = 1;
    for(int i = 1;i <= n;i++){
      produit *= i;
    }
    return produit;
    }
   //-------------setup----------------
   void setup(){
    println("le factorielle de 16  est "+factorielle(16));
    println("le factorielle de 17  est "+factorielle(17));
   }
   
   

Voila ce qu'affiche la console :

le factorielle de 16 est 2004189184 le factorielle de 17 est -288522240

Ce qui est absurde. Essayons de comprendre ce qui s'est passé

Codage des entiers

Pour simplifier dans un premier temps, supposons que les nombres ne peuvent être écrits que sur un octet

Codage d'un entier relatif sur n bits (n=32 ou 64)

Exercice

  1. Vérifier que 479 001 600 = 12! est inférieur à $2^{31}-1$ = 2 147 483 647 mais que 13! = 6 227 020 800 est supérieur ou égal à $2^{31}$ et même à $2^{32}= 4 294 967 296$
  2. Comment expliquer que pour 13! l'ordinateur affiche 1 932 053 504 (utiliser un tableur)