codage des nombres entiers relatifs...les circuits mémoire un bit sont souvent groupés par huit...

14
TP 2 : Vendredi 13 Septembre 2013 Codage des nombres entiers relatifs Continuons à coder notre monde Partie du programme : Représentation de l’information La mémoire des ordinateurs est constituée d’une multitude de petits circuits électroniques qui, chacun, ne peuvent être que dans 2 états : hors tension ou sous tension. Comme il a fallu donner un nom à ces états, on a décidé de les appeler 0 et 1. Un tel circuit à 2 états s’appelle un circuit mémoire un bit. Le nombre entier naturel 13, représenté en base 2 par : est donc représenté dans la mémoire d’un ordinateur par le mot 1101, c’est-à-dire par 4 circuits mémoire un bit respectivement dans les états 1, 0, 1, 1. Les circuits mémoire un bit sont souvent groupés par huit (octet) et on utilise des nombres exprimés en langage binaire sur un, deux, quatre ou huit octets soit 8, 16, 32 ou 64 bits. Sur un octet, on peut représenter les nombres entiers naturels allant de 0 à : Sur deux octets, on peut représenter les nombres entiers naturels allant de 0 à : Sur quatre octets, on peut représenter les nombres entiers allant de 0 à Sur huit octets, i.e. 64 bits : on peut représenter tous les nombres entiers naturels allant de 0 à . Dans le langage Python, on ne peut manipuler que des nombres entiers relatifs : tous les entiers sont signés. Il faut étendre aux entiers relatifs la représentation binaire des entiers naturels. 1 ère solution naturelle : réserver un bit pour le signe et utiliser les autres pour représenter sa valeur absolue. Ainsi, avec des mots de 16 bits, si on utilise 1 bit pour le signe et 15 bits pour la valeur absolue, on pourrait représenter les entiers relatifs allant de : - = - = - 32 767 à = = 32 767. Inconvénient de cette méthode (entre autres) : existence de deux zéros l’un positif et l’autre négatif ! Solution choisie : la notation en complément à 2. On va représenter un entier relatif par un entier naturel. Si on utilise des mots de 16 bits, on va pouvoir représenter les entiers relatifs de -32 768 à 32 767 en procédant ainsi : Représentation binaire : Un ordinateur est une machine qui manipule des valeurs numériques représentées sous forme binaire. Compétence : Manipuler à l’aide d’opérations élémentaires les trois unités de base : bit, octet, mot. Numérisation : L’ordinateur manipule uniquement des valeurs numériques. Une étape de numérisation des objets du monde physique est donc indispensable. Compétence : Coder un nombre, un caractère au travers d’un code standard, un texte sous forme d’une liste de valeurs numériques. Numériser une image ou un son sous forme d’un tableau de valeurs numériques.

Upload: others

Post on 29-Mar-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

TP 2 : Vendredi 13 Septembre 2013

Codage des nombres entiers relatifs

Continuons à coder notre monde …

Partie du programme : Représentation de l’information

La mémoire des ordinateurs est constituée d’une multitude de petits circuits électroniques qui, chacun, ne

peuvent être que dans 2 états : hors tension ou sous tension.

Comme il a fallu donner un nom à ces états, on a décidé de les appeler 0 et 1.

Un tel circuit à 2 états s’appelle un circuit mémoire un bit.

Le nombre entier naturel 13, représenté en base 2 par : est donc représenté dans la mémoire d’un

ordinateur par le mot 1101, c’est-à-dire par 4 circuits mémoire un bit respectivement dans les états 1, 0, 1, 1.

Les circuits mémoire un bit sont souvent groupés par huit (octet) et on utilise des nombres exprimés en

langage binaire sur un, deux, quatre ou huit octets soit 8, 16, 32 ou 64 bits.

Sur un octet, on peut représenter les nombres entiers naturels allant de 0 à : Sur deux octets, on peut représenter les nombres entiers naturels allant de 0 à :

Sur quatre octets, on peut représenter les nombres entiers allant de 0 à Sur huit octets, i.e. 64 bits : on peut représenter tous les nombres entiers naturels allant de 0 à .

Dans le langage Python, on ne peut manipuler que des nombres entiers relatifs : tous les entiers sont signés.

Il faut étendre aux entiers relatifs la représentation binaire des entiers naturels.

1ère

solution naturelle : réserver un bit pour le signe et utiliser les autres pour représenter sa valeur

absolue.

Ainsi, avec des mots de 16 bits, si on utilise 1 bit pour le signe et 15 bits pour la valeur absolue, on pourrait

représenter les entiers relatifs allant de :

- = - = - 32 767 à = = 32 767.

Inconvénient de cette méthode (entre autres) : existence de deux zéros l’un positif et l’autre négatif !

Solution choisie : la notation en complément à 2.

On va représenter un entier relatif par un entier naturel. Si on utilise des mots de 16 bits, on va pouvoir

représenter les entiers relatifs de -32 768 à 32 767 en procédant ainsi :

Représentation binaire :

Un ordinateur est une machine qui manipule

des valeurs numériques représentées sous

forme binaire.

Compétence :

Manipuler à l’aide d’opérations élémentaires

les trois unités de base : bit, octet, mot.

Numérisation :

L’ordinateur manipule uniquement des valeurs

numériques. Une étape de numérisation des

objets du monde physique est donc

indispensable.

Compétence :

Coder un nombre, un caractère au travers d’un

code standard, un texte sous forme d’une liste

de valeurs numériques.

Numériser une image ou un son sous forme d’un

tableau de valeurs numériques.

Si l’entier relatif x est positif ou nul : on le représente comme l’entier naturel x.

Si l’entier relatif x est strictement négatif : on le représente comme l’entier naturel x + = x + 65 536,

nombre entier compris entre -32 768 + 65 536 = 32 768 et -1 + 65 536 = 65 535.

Schéma :

-32 768 ; -32 767 ; …….. ; -1 0 ; 1 ; ……….… ; 32 767 ; 32 768 ; 32 769 ; ………… ; 65 535

Comment est codé le nombre entier relatif -1 ?

Il est représenté dans l’ordinateur comme l’entier naturel 65 535 l’est soit :

1111 1111 1111 1111.

SYNTHESE : Plus généralement, avec des mots de n bits, on peut représenter les entiers relatifs compris

entre et On représente l’entier relatif x positif ou nul comme l’entier naturel x.

On représente l’entier relatif x strictement négatif comme l’entier naturel x + .

Ainsi, un entier positif est représenté par un mot dont le premier bit sera 0, et un entier négatif par un mot

dont le premier bit sera 1.

Expliquons le dernier cas dans le cas des nombres codés sur 16 bits :

32 768 = donc tout nombre entier compris entre 32 768 et 65 535 a forcément son bit le plus fort égal à

1.

Exemple : 32 770 = 32 768 + 2 = = 1000 0000 0000 00102.

Au contraire, un entier positif codable sur 16 bits, varie entre 0 et 32 767 : 32 767 <

Donc si on prend par exemple, 16 384 = = 0100 0000 0000 00002.

Comment savoir si l’entier sera codé sur 16 bits ? 32 bits ?

Rien dans la représentation binaire n’indique comment il faut interpréter un mot mémoire donné.

Le même mot peur être lu de différentes façons.

Il faut donc garder à part une trace des conventions de codage qu’on a décidé d’utiliser.

Dans les versions Python 2.x, le type int désigne en principe des entiers relatifs représentés sur 32 bits, cad 4

octets : les valeurs possibles sont donc de – 2 147 483 648 à 2 147 483 647.

Mais, si on travaille sur une machine 64 bits, la représentation des entiers sera également faite sur 64 bits :

on dispose donc des entiers de -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807 !!!

L’ensemble des valeurs de type int dépend donc de la machine sur laquelle un programme Python est

exécuté.

Exercices : 1°) Quels entiers relatifs peut-on coder sur huit bits ?

2°) Trouver les représentations sur huit bits des entiers relatifs 0 et -128, 127, 101 et -94 :

3°) Déterminer les valeurs des entiers relatifs codés sur huit bits par :

0001 0111 et 1000 1100

4°) Calculer la représentation sur huit bits de l’entier relatif 11, puis celle de son opposé :

Remarque : on inverse tous les bits et on ajoute 1

Dépassement de Capacité : Que se passe-t-il quand on atteint les limites ?

On suppose une représentation sur 32 bits.

a = 260

a * a = 67 600

a * a * a = 17576000

a * a * a * a = 4569760000

Ce dernier résultat, en binaire est codé par : 1 00010000 01100001 00000001 00000000.

Si on reste dans une représentation en 32 bits, le bit le plus à gauche est perdu ! On ne mémorise que

00010000 01100001 00000001 00000000 qui vaut 274 792 704. Ce n’est pas le résultat attendu !!

On appelle ce phénomène dépassement arithmétique (overflow en anglais)

En Python, on retiendra que, la seule limite pour la représentation des entiers, qu’ils soient naturels ou

relatifs, est la mémoire disponible sur la machine. L’exemple précédent ne se produira pas !

Dans les versions Python 2.x, lorsque la capacité des entiers machines (32 ou 64 bits) a été dépassée, les

nombres sont suivis du marqueur L, qui explicite qu’on passe dans un autre type appelé long.

On aurait donc plutôt comme ligne : 4569760000L

En Python 3.x, les types int et long ont été fusionnés, et on retient que les entiers sont toujours de taille

illimitée, le marqueur L n’est plus utilisé.

Types de données, structures de contrôles, fonctions version Python 3.3.2.

Une boîte ne sait pas comment elle s’appelle. C’est à nous de lui donner un nom, et une forme.

Un ordinateur peut bien faire des choses, mais il faut d’abord les lui expliquer.

Un ordinateur est fait pour exécuter des calculs longs et répétitifs.

Partie du programme : Algorithmique

Partie du programme : Langages et programmation

I/ Algorithmique :

Diaporama

II/ Programmation en Python : (source : Université du Sud Toulon Var)

Algorithmes simples :

Compétence :

Comprendre un algorithme et expliquer ce qu’il

fait.

Modifier un algorithme existant pour obtenir

un résultat différent.

Concevoir un algorithme.

Programmer un algorithme.

Types de données : Nombre entier ;

Virgule flottante ;

Booléen ;

Caractère ;

Tableau ;

Chaîne de caractères.

Compétence :

Choisir un type de données en fonction d’un

problème à résoudre.

Fonctions : Notion de fonction ;

Portée des variables et passage d’arguments ;

Compétence :

Concevoir l’entête d’une fonction, puis la

fonction elle-même.

1°) Les variables :

2°) Les types de données :

Version Python 2.x

3°) L’affectation :

4°) Instruction d’entrée ou de sortie :

VERSION 2.x

En Python 3.x, input() renvoie

toujours une chaîne de caractères !

VERSION 2.x

En Python 3.x, mettre des

parenthèses : print( …. )

5°) Les structures de contrôle :

Version 2.x

Boucle FOR

Syntaxe à venir

6°) Les fonctions :

Exemples :

x = 7

print(x)

x une variable globale

def f() :

y = 8

return y

La variable y est ici locale

7°) Allons-y !

Pour exécuter les instructions Python, nous allons utiliser l’environnement spécialisé IDLE.

Cet environnement se compose d’une fenêtre appelée console, shell ou terminal Python.

L’invite de commande se compose de 3 chevrons : il suffit de saisir à la suite une instruction puis de taper

sur la touche entrée du clavier.

>>> print (’’Bonjour !‘’)

Bonjour !

>>>

On peut utiliser la console Python comme une calculatrice :

>>> 3 * 5

15

>>> a = 0

>>> if a = = 0 :

print (‘’C’est vrai’’)

else :

print (“C’est faux”)

C’est vrai

>>> for i in range(1,3) :

print(i)

1

2

Ainsi, on peut exécuter les instructions au fur et à mesure.

Pour exécuter un programme plus long, sous l’environnement IDLE, il suffit d’ouvrir un fichier texte en

choisissant l’entrée NewWindow dans le menu File puis on sauvegarde son fichier sous un nom de la forme

toto.py, enfin la commande RunModule du menu Run vous permettra de lancer l’exécution du contenu de

votre fichier dans la console Python.

Voici un premier programme

a = 4

b = 7

print("A vous de jouer")

x = int(input())

y = int(input())

if x == a and y == b :

print("coulé")

else :

if x == a or y ==b :

print("en vue")

else :

print("A l'eau")

Une expression est une suite de caractères définissant une valeur.

En Python, les expressions sont classées en fonction de leur type :

type int (integer) : comme l’expression 1 + 3, dont la valeur est un nombre entier.

type float (floating point number) : comme 1.5 + 1.64 dont la valeur est le nombre à virgule

3,14.

type boolean comme l’expression booléenne x == 3 dont la valeur est False ou True suivant

l’état d’exécution du programme.

type str comme "coulé" dont la valeur est une chaîne de caractères.

Il est constitué de différentes instructions :

des affectations : du type v = e où v est une variable et e une expression ;

des instructions d’entrée : du type v = int(input( )) où v est une variable ;

des instructions de sortie de la forme : print(e) où e est une expression ;

des séquences de la forme : p suivi de q où p et q sont deux instructions ;

des tests de la forme :

if e :

p

else :

q

L’instruction x = y + 3 fait intervenir une variable x et une expression y + 3.

On attribue une valeur à chaque expression : pour celles qui ne comportent pas de variable, on obtient la

valeur en effectuant les opérations qui y figurent (par exemple : 2 * 3) ; pour celles qui comportent des

variables, cela dépendra des valeurs contenues par les variables lors de l’état d’exécution du programme.

Exercice 1 :

Instruction ou expression ?

x

x = y

print(x + 3)

x = int(input())

x == a

Les expressions sont formées en utilisant les opérations élémentaires suivantes :

+ Addition entière

- Soustraction entière

* Multiplication entière

// Quotient de la division euclidienne

% Reste de la division euclidienne

+ Addition décimale

- Soustraction décimale

* Multiplication décimale

/ Division décimale

pow Puissance

sqrt Racine

pi

L’indentation :

En Python, l’indentation est partie intégrante de la syntaxe, dans la plupart des autres langages, ce sont des

accolades qui sont utilisées pour lever les ambiguïtés.

Exercice 2 :

Exercice 3 :

Pour chaque question, exécutez les commandes et commentez-les :

>>> 3+2 >>> s=12

>>> m=24

>>> s=s+m

>>> 3*s

>>> s=5

>>> s**2

>>> n=13

>>> n/2

>>>n//2 >>> n%2

sin Sinus

cos Cosinus

exp Exponentielle

log Logarithme népérien

abs Valeur Absolue

min Minimum

max Maximum

floor Partie entière

random Nombre aléatoire décimal entre 0 et 1, selon la loi uniforme

== Egal

!= Différent

<= Inférieur ou égal

< Inférieur strictement

>= Supérieur ou égal

> Supérieur strictement

len Longueur d’une chaîne de caractères

s[n] n-ième élément de la chaîne de caractères s

chr Prend en argument un entier n et retourne une chaîne de

caractères qui contient un unique caractère dont le code ASCII

est n.

ord Fonction inverse de la précédente, qui prend en argument une

chaîne de caractères s constituée d’un seul caractère et

retourne le code ASCII de ce caractère.

+ Concaténation. S’applique à deux chaînes de caractères et

construit une unique chaîne formée de la première, suivie de

la seconde.

not Non

and Et (variante : &)

or Ou (variant : |)

Exercice 4 :

Ci-dessous un programme écrit en langage Python

1. Quel est le type des variables a et b ? (lignes 1 et 2)

2. Quelles valeurs sont retournées dans les variables c et d ? (lignes 5 et 6)

3. Expliquer le rôle de la structure conditionnelle (lignes 3 à 6 )

4. Proposer une chaîne de caractères à insérer dans le print() de la ligne 7 qui permettrait à l’utilisateur

de comprendre à quoi sert ce programme .

Exercice 5 :

1. Quel est le type des variables a et b ? (lignes 1 et 2)

2. Expliquer brièvement ce que fait ce programme et compléter les … des lignes 4 et 5.

3. Ce programme comporte des erreurs d’écriture aux lignes 2 à 6

Réécrire le programme sur votre copie en les corrigeant.

4. Proposer une troisième alternative (cohérente) et l’insérer dans la structure conditionnelle.

Exercice 6 :