Univ. Lille 1 - Licence Informatique 2ème année 2013-14 Codage de l'information Représentation des nombres (2) Objectifs du TP Ce TP a pour but 1. d'étudier la programmation des conversions entiers <-> chaînes de caractères ; 2. et d'étudier la représentation des nombres ottants. Outils utilisés le langage Objective Caml ; des utilitaires de représentation de la norme IEEE 754 des ottants. La documentation des diérentes fonctions à réaliser est disponible à l'adresse http://www.fil.univ-lille1.fr/~wegrzyno/portail/codage/doc/tp/tp-nombres2/doc/conversions.html. 1 Conversion d'un entier en une chaîne de caractères Il s'agit dans cette partie de réaliser une fonction analogue à la fonction string_of_int, mais qui convient pour toutes les bases comprises entre 2 et 16. 1.1 Impression des entiers avec Printf.printf Tous les langages de programmation orent au programmeur la possibilité d'imprimer les nombres entiers. Objective Caml n'échappe pas à la règle, avec la procédure print_int, ou encore la procédure Printf.printf. # print_ int 31415 ;; 31415 - : unit = () # Printf. printf "%d\n" 31415 ;; 31415 - : unit = () Dans le premier cas, la procédure print_int imprime l'entier 31415 (sans passer à la ligne), et dans le second cas, c'est le format d'impression %d qui précise à printf qu'il s'agit d'imprimer un entier (le \n qui suit précise que l'entier imprimé doit être suivi d'un passage à la ligne). Pour des raisons assez simples, il est tout à fait naturel que l'impression se fasse en base 10. Cependant, à la diérence de la procédure print_int, il est possible de demander à la procédure printf d'imprimer les entiers en base 8 ou en base 16. Il sut de remplacer le format %d pour le décimal par les formats %o pour l'octal ou %X ou x pour l'hexadécimal. (il n'existe pas de format pour l'impression en binaire.) Question 1 Imprimez les entiers de votre choix avec la procédure printf et les diérents formats. Quelle diérence y a-t-il entre les formats %x et %X? 1
1.2 Remarque sur les entiers de Objective Caml Question 2 Écrivez une instruction en Caml qui permet d'acher les puissances de 2 consécutives pour les exposants variant de 0 à 40. Vous devz obtenir un achage semblable à celui-ci : 0 : 1 1 : 2 2 : 4 3 : 8 4 : 16 5 : 32 6 : 64 7 : 128 8 : 256 9 : 512 10 : 1024... Question 3 Qu'observez-vous pour la puissance 30ème? Et pour les puissances qui suivent? Expliquez! Si les procédures print_string et printf impriment les entiers en base 10 (ou en base 8 ou 16 pour la seconde procédure), il n'en reste pas moins que la représentation interne en machine est binaire. Il est donc nécessaire de convertir les entiers machines en des chaînes de caractères que l'on peut imprimer. C'est le but des deux sections qui suivent. 1.3 Transformer un entier en un chire Question 4 Quel est le type des fonctions du langage Caml char_of_int et int_of_char? En particulier, que valent les expressions char_of_int 0? char_of_int 1?... char_of_int 9? Et int_of_char '0'? int_of_char '1'?... int_of_char '9'? int_of_char 'A'? int_of_char 'B'?... int_of_char 'F'? Question 5 Que vaut l'expression char_of_int (int_of_char '0' + n) lorsque n est un entier compris entre 0 et 9? et si n 10? Question 6 Si n désigne un entier compris entre 10 et 15 inclus, quelle expression dépendant de n et utilisant ces deux fonctions donne un caractère compris entre 'A' et 'F' avec la correspondance 10 -> 'A',..., 15 -> 'F'? Question 7 Réalisez une fonction nommée entier_en_chiffre de type int char qui pour un entier compris entre 0 et 15 renvoie le chire (char) hexadécimal correspondant, et pour tout autre entier déclenche l'exception Failure "entier_en_chiffre entier negatif ou trop grand" : 1.4 Convertir un entier en une chaîne de caractères Question 8 Réalisez une fonction nommée entier_en_chaine de type 2
int int string qui pour deux entiers n et b renvoie l'écriture de l'entier n en base b. Cette fonction déclenche l'exception Failure "entier_en_chaine base incorrecte" : si b > 16. Pour cela, vous pourrez utiliser avec prot la fonction let ajoute_ caractere_ en_ tete s c = let s ' = String. make 1 c in s '^ s Question 9 Utilisez la fonction que vous venez de réaliser, ainsi que la procédure printf avec le seul format %s d'impression de chaînes, pour acher sous forme d'un tableau les écritures décimales, binaires, octales et hexadécimales des entiers de 0 à 20. L'achage doit avoir la forme 0 : 0 0 0 1 : 1 1 1 2 : 10 2 2 3 : 11 3 3 4 : 100 4 4 5 : 101 5 5 6 : 110 6 6 7 : 111 7 7 8 : 1000 10 8 9 : 1001 11 9 10 : 1010 12 A 11 : 1011 13 B 12 : 1100 14 C 13 : 1101 15 D 14 : 1110 16 E 15 : 1111 17 F 16 : 10000 20 10 17 : 10001 21 11 18 : 10010 22 12 19 : 10011 23 13 20 : 10100 24 14 2 Conversion d'une chaîne de caractères en un entier Il s'agit maintenant d'étudier l'opération inverse, à savoir convertir une chaîne de caractères représentant un nombre entier écrit dans une base b en l'entier correspondant. En quelque sorte, il s'agit de réaliser l'analogue de la fonction int_of_string. 2.1 Entrée des entiers en hexa ou en octal En Caml, il est possible de travailler avec des entiers écrits en hexadécimal ou en octal. Il sut de préxer l'écriture par 0x pour une écriture hexadécimale, et par 0o pour une écriture octale. 3
# 0 xa ;; - : int = 10 # 0 o17 ;; - : int = 15 # 123 ;; - : int = 123 # 0 x123 ;; - : int = 291 # 0 o123 ;; - : int = 83 # 123 + 0 x123 + 0 o123 ;; - : int = 497 Question 10 Utilisez cette possibilité pour déterminer l'entier dont l'écriture hexadécimale est 314 16. Même chose pour l'entier écrit en octal 314 8. 2.2 Convertir un chire en entier Question 11 Réalisez la fonction chiffre_en_entier de type char int qui renvoie l'entier correspondant au chire passé en paramètre. Cette fonction doit déclencher l'exception Failure "chiffre_en_entier chire incorrect" : si le chire passé en argument n'est pas l'un des caractères '0', '1',..., '9' ou 'A', 'B',..., 'F'. 2.3 Convertir une chaîne en entier Question 12 Réalisez la fonction chaine_en_entier de type string int int qui renvoie l'entier dont l'écriture est passée en (premier) paramètre dans la base passée en (seond) paramètre. Cette fonction doit déclencher l'exception Failure "chaine_en_entier base incorrecte" : Question 13 Si vous considérez votre NIP comme une chaîne de caractères de longueur 8, cette chaîne peut être considérée comme l'écriture hexadécimale d'un nombre entier. Quel est cet entier? 3 Opérations logiques sur les entiers 3.1 Les opérateurs logiques sur les entiers en Caml Les opérateurs logiques sur les entiers sont prédénis en Caml. land : int int int opération et bit à bit. lor : int int int opération ou bit à bit. lxor : int int int opération ou exclusif bit à bit. lnot : int int opération non bit à bit. 4
lsl : int int int décalage à gauche. lsr : int int int décalage à droite. Question 14 Testez chacune de ces fonctions dans un interpréteur du langage. Question 15 Quelle est la signication arithmétique de l'opération logique n lsl 1? Et de n lsr 1? Question 16 Reprenez la question?? sans utiliser d'opérations arithmétiques, mais uniquement des opérations logiques. Question 17 Comment avec les opérations logiques peut-on tester si un entier est pair? 3.2 Retour sur la conversion en base 2 Il s'agit ici de revenir sur la conversion d'un entier en une chaîne binaire et réciproquement. Question 18 Sans utiliser d'opérations arithmétiques, réalisez la fonction entier_en_chaine_binaire de type int string qui donne l'écriture binaire de son argument. Question 19 Comparez l'écriture binaire obtenue pour deux entiers de signes contraires. Explication? Question 20 de type Sans utiliser d'opérations arithmétiques, réalisez la fonction chaine_binaire_en_entier string int qui à partir d'une écriture binaire renvoie l'entier qui lui correspond. Cette fonction déclenche l'exception Failure "chaine_binaire_en_entier symbole non binaire" : 4 Représentation des ottants Utilisez les liens qui suivent pour étudier sur quelques exemples la représentation des ottants 1. Conversion de la représentation décimale en représentation IEEE-754 sur 32 et 64 bits Conversion de la représentation sur 32 bits en écriture décimale Conversion de la représentation sur 64 bits en écriture décimale En particulier répondez aux questions qui suivent Question 21 Quelles sont les représentations sur 32 et 64 bits de 3, 141592? Donnez la représentation sous forme hexadécimale. Quelles sont les valeurs du signe s, de l'exposant e et de la mantisse m? Question 22 Quel est le nombre dont le codage sur 32 bits est 0F 1E2D3C? Question 23 Quel est le plus petit réel positif représentable sur 32 bits? sur 64 bits? Question 24 Quel est le plus grand? 1. ces pages proviennent du site http://babbage.cs.qc.edu/ieee-754/. 5