|
|
Un octet peut représenter plusieurs choses selon la variable qui a été déclarée :
Code ASCII première et seconde page.
La première page peut être interprétée comme étant codée sur 7 bits avec le bit de poids fort à 0. La seconde page correspond alors au bit de poids fort à 1.
Il est impossible en informatique de représenter tous les éléments de N
Nous ne pouvons représenter qu’un nombre fini d’entiers, appartenant à un intervalle donné [0; 2n-1], où n correspond au nombre de bits utilisés
Nombre non signé, sur un octet.
min=O=OOOOOOOO=OO
max=255=11111111=FF=28-1
Nombre non signé sur deux octets
min=0
max=1111111111111111=FFFF=216-1=65535
Nombre non signé sur 4 octets
min=0
max=FFFFFFFF=232-1=65536² -1= 4 294 967 295
Nombre non signé sur n octets
min=0
max=28n-1
Représentation bornée de Z
Nombre signé sur un octet
Codé sur un octet, le bit de poids fort, est considéré comme bit de signe.
Convention habituelle : si ce bit vaut zéro, le nombre est considéré comme positif.
Il varie donc entre 0 et 1111111=27-1=127
Si ce bit vaut 1, le nombre est négatif.
Il en résulte que 0 a deux représentations +0=00000000 et -0=10000000
L’intervalle de Z est donc [-27+1 , 27-1]=[-127 , +127]
Bit de signe |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
nombre |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
+0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
+127 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
-127 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
-27 |
Nombre signé sur deux octets
L’intervalle de Z est donc [-215+1 , 215-1]=[-32767 , +32767]
Nombre signé sur quatre octets
L’intervalle de Z est donc [-231+1 , 231-1]=[- 2147483647 , + 2147483647
Nombre signé sur n octets
L’intervalle de Z est donc [-28n-1+1 , 28n-1-1]
Les problèmes des nombres signés.
Comme nous l’avons vu, le microprocesseur ne connaît que l’addition.
Par exemple en représentation sur un octet, ajoutons 213 à 125 nous obtenons le nombre 338 qui est supérieur à 255, il y a donc débordement. En effet en binaire nous obtenons : 11010101+ 1111101= 101010010
0+0=0 ; 1+0=1; 1+1=10 (donc retenue dans ce cas)
1-0=1 ; 10-1=1;0-0=0 ; 1-1=0
Exemple sans débordement
Ajoutons les nombres 12 et 56 en binaire non signé sur un octet.
12+56=00001100+00111000=01000100=68
Exemple avec débordement
Ajoutons les nombres 143 et 209 en binaire non signé.
143+209=10001111+11010001=1 01100000=352
L’assembleur prévoit cette situation (Carry)
Mais en programmation, certains flags n’ont pas le même sens en arithmétique signée et en arithmétique non signée. Le programmeur doit donc savoir quels types de nombres il manipule.
Cette technique va permettre d’avoir une autre représentation binaire des nombres négatifs en arithmétique signée.
Le nombre est positif ou nul
Le nombre est négatif
exemples
Le complémentaire à deux permet de
transformer une soustraction en une addition
Prenons le nombre 7. Sa représentation binaire sur 8 bits est 00000111.
Prenons le nombre -5. Sa valeur absolue sur 8 bits s’écrit 00000101.
On complémente à 1 ce qui donne 11111010
On ajoute 1 ce qui donne 11111011
Calculons 7-5=00000111+11111011= 100000010. Les huit derniers bits permettent bien de trouver 2, mais il y a un débordement (dernier bit ).
Autre exemple
Pour 40-22
on peut poser 101000-10110 faire la soustraction directement ce qui donne 10010
c'est-à-dire 18.
On peut aussi considérer que l’opération se fait sur 6 chiffres car 40 s’écrit en binaire sur 6 chiffres, et appliquer la régle des complémen-taires à 1 puis à 2 à -22, en tenant compte du zéro devant.
puis on ajoute 101000+101010 ce qui donne 1010010. Soit, en ne tenant compte que de 6 chiffres, 010010, c'est-à-dire 18
Nombre |
Valeur absolue |
Complémentarité
à 1 si nombre négatif |
Complémentarité à 2 (ajoutons 1) |
0 |
0000 |
|
0000 |
1 |
0001 |
|
0001 |
2 |
0010 |
|
0010 |
3 |
0011 |
|
0011 |
4 |
0100 |
|
0100 |
5 |
0101 |
|
0101 |
6 |
0110 |
|
0110 |
7 |
0111 |
|
0111 |
-1 |
0001 |
1110 |
1111 |
-2 |
0010 |
1101 |
1110 |
-3 |
0011 |
1100 |
1101 |
-4 |
0100 |
1011 |
1100 |
-5 |
0101 |
1010 |
1011 |
-6 |
0110 |
1001 |
1010 |
-7 |
0111 |
1000 |
1001 |
-8 |
1000 |
0111 |
1000 |
Avec 8 nous aurions obtenons 1000 soit la même représentation que -8. Nous obtenons ainsi une représentation modulo 16
Exemples en TURBO PASCAL
Les nombres de type BYTE en Turbo Pascal illustrent les nombres non signés, et les nombres de type SHORTINT les nombres signés avec complémentarité à 2.
Seuls les nombres de type INTEGER sont normalisés et correspondent au Pascal Standard.
Tables
0*0=0 ; 0*1=0 ; 1*0=0 ; 1*1=1
Exemples
Calculer en binaire le produit des nombres 34 et 57 en base dix. |
|
(Le DCB est donné à titre d’information. Il ne fait pas parti du programme de l’examen).
Signification : Décimal Codé Binaire.
Chaque chiffre du nombre est codé sur 4 bits
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0000 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
1001 |
Il en résulte que les combinaisons de 1010 à 1111 sont inutilisées.
Prenons par exemple le nombre 8362
8 |
3 |
6 |
2 |
1000 |
0011 |
0110 |
0010 |
Deux chiffres par octet
Le nombre 8362 s’écrit sur deux octets 10000011 01100010
Un seul chiffre par octet
Le nombre 8362 s’écrit sur quatre octets 00001000 00000011 00000110 00000010
Le résultat est inférieur ou égal à 10
Ajoutons les entiers naturels 5 et 3 en base dix.
5+3=0101+0011=1000=8 pas de problème
Le résultat est supérieur à 10
Ajoutons les entiers 7 et 6 en base dix.
7+6=0111+0110=1101. Cette représentation n’a pas de signification.
Or sur 4 bits ont peut représenter seize états. 6 de ces états n’ont pas de signification en DCB. Ajoutons 6 au résultat précédent :
1101+0110=10011 que l’on peut écrire 0001 0011 qui code 1 et 3 soit 13
Lorsque le résultat n’a pas de signification, il faut ajouter 6 (0110).
Exemple
Calculer en DCB 867+315
Premier nombre |
|
8 |
6 |
7 |
Deuxième nombre |
|
3 |
1 |
5 |
Premier nombre |
|
1000 |
0110 |
0111 |
Deuxième nombre |
|
0011 |
0001 |
0101 |
Somme DCB |
|
1011 |
0111 |
1100 |
Correction (+6) |
|
0110 |
|
0110 |
Nouvelle somme |
1 |
0001 |
1000 |
0010 |
Traduction décimale |
1 |
1 |
8 |
2 |
Les informaticiens parlent de la représentation des réels par abus de langage. Toutes les représentations numériques étant limitées à n octets, seules certains nombres décimaux seront représentés (le nombre n d’octets étant choisi en fonction du nombre de chiffres significatifs souhaités). Les réels en informatique ne sont qu’un sous ensemble des nombres décimaux.
Les nombres sont représentés sous forme naturelle avec la précision prévue sur les parties entières et décimales.
La virgule n’a pas de réalité physique, elle correspond simplement à un rang.
Cette notation ne peut être utilisée que pour des nombres qui ont le même ordre de grandeur.
Par exemple, avec une précision de 4 chiffres sur les deux parties.
Nombre |
Partie entière |
Partie décimale |
645 |
0645 |
0000 |
23,789 |
0023 |
7890 |
0,48515 |
0000 |
4851 |
Multiplication
Multiplication
binaire
Multipliez en binaire 11 par 12
1011*1100=10000100 soit 132
Il est clair que si chaque nombre binaire est codé sur n bits, le résultat est codé sur 2n bits.
Si chacun de ces nombres binaires représente un nombre à virgule, le problème de la précision va se poser sérieusement.
Sur une calculatrice essayez l’algorithme suivant, qui part de n=2 et devrait aboutir à n=2.
Début
n=2;
Pour i de 1 à 50 faire
Fin du pour
Fin
Il est clair que la précision sur la multiplication risque d’être faible. Dans le cas extrême où les deux nombres utilisent toutes les décimales possibles, nous allons en perdre la moitié sur le produit.
Cette représentation sera utilisée pour les nombres n’ayant pas le même ordre de grandeur et pour les représentations des ‘réels’ dans la majeure partie des langages.
Forme normalisée des réels
0,127=+0,127.100 ; 34,12=+0,3412.102
; -0,000757=-0,757.10-3
Ainsi sous cette forme il faut retenir
· Le signe du nombre
· La mantisse
· Le signe de l’exposant
· L’exposant
Pour la codification sur n octets (n variant selon les machines et la précision souhaitée) ou pourra par exemple, réserver le premier octet pour l’exposant (le bit de poids fort étant le bit de signe de l’exposant) et les n-1 octets suivants étant utilisés pour la mantisse. Là encore le bit de poids fort est utilisé comme bit de signe de la mantisse.
Ce qui vient d’être dit est valable dans toutes les bases, en particulier en base 2.
Par exemple représentons, en virgule flottante, en base deux, le nombre 103 base dix.
-103=-1100111=-0,1100111*(2)(7)=-0,1100111*10111
l’écriture sera :
(Ce type d’écriture n’est pas au programme de l’examen. Ce code est donné à titre d’information).
Signification : Extended Binary Code Decimal Information Code
Code utilisé par IBM. En fait, c’est une variation sur 8 bits du code DCB où tout est codifié comme étant des caractères :
Chaque octet est divisé en deux quartets. Si le premier quartet est 1111 alors le deuxième quartet représente un chiffre. Ainsi 1111 0010 représente le chiffre deux. Pour convertir 19 de EBCDIC en DCB : nous partons de 11110001 - 11111001 où :
En supprimant les deux premiers quartets on obtient 00011001 qui est bien le DCB de 19
Sur un PC une carte se réserve la zone d’adresses comprise entre EC000 et ED000.
Combien cette carte réserve-t-elle de Ko, de mots ?
On appelle MOT un bi-octet soit un groupement de 16 bits.
ED000-EC000=1OOO=163=4096=4Ko=2048 mots
On se donne les nombres 157 et 812 en base dix.
Exprimer ces nombres ainsi que leur produit, le quotient et le reste de la division du deuxième par le premier, en hexadécimal et en binaire.
Ecrire 157 en binaire signé sur deux octets.
Ecrire -157 en binaire signé sur deux octets
Ecrire 157 en DCB compacté sur 4 bits
Ecrire 157 en DCB non compacté.
Ecrire 157 en complémentaire à deux sur deux octets
Ecrire -157 en complémentaire à deux sur deux octets
Ecrire -1 en complémentaire à deux sur deux octets
Le Pascal utilise le complémentaire à deux pour représenter le type INTEGER
Ecrire l’INTEGER 32767 en binaire complémentaire à deux,sur deux octets.
Ajouter 1, pour avoir un débordement. Que trouvez-vous en binaire sur les deux octets ?
Ecrire un programme Pascal permettant de vérifier les écritures précédentes. Vérifier en utilisant l’adresse que l’octet de poids faible est écrit avant l’octet de poids fort.
157=9D=10011101. 812=32C=1100101100 (Soit 1 mot plus un bit de ébordement)
157*812=127484=1F1FC=1 1111 0001 1111 1100
q=5=5=101
r=27=1B=11011
32767 = 01111111 11111111
32767 +1 =10000000 00000000 = -32768 par NON convention du zero négatif.
Ecrire un petit programme en
Pascal, pour analyser les problèmes de débordement.
On suppose que i est un Integer.
Partir de i=32767. Calculer et afficher i+1.
Partir de i=-32768. Calculer et afficher i-1.
Program Essai ;
uses crt ;
var i :integer ;
BEGIN
i :=32767 ;
i :=i+1 ;
writeln(‘32768
donne ‘,i) ;
i :=-32768 ;
i :=i-1 ;
writeln(-32769
donne ‘,i) ;
readln ;
END.