Comment l’ordinateur représente l’information ?
Tout est binaire (0/1). Sur cette base, on encode des nombres, des lettres, des couleurs, du son. Comprendre les types et leurs valeurs de base est essentiel pour programmer sans erreurs.
Ce que vous allez apprendre
- Binaire : bit, octet, puissances de 2, conversions décimal↔binaire↔hexadécimal.
- Nombres : entiers signés (complément à deux, bornes), réels en virgule flottante (IEEE 754, arrondis).
- Booléens : logique (Vrai/Faux), opérateurs (
and,or,not). - Chaînes de caractères : encodage ASCII/Unicode, UTF‑8, code point, byte.
- Types en Python :
int,float,bool,str, conversions (int(),float(),str()).
Vocabulaire à maîtriser
1) Binaire, puissances de 2 et conversions
Un octet contient 8 bits : il représente 2^8 = 256 valeurs différentes (0–255). Le binaire s’additionne et se convertit en décimal/hexadécimal par groupes de bits.
# Astuce de conversion
# Décimal → Binaire (ex. 42)
# 42 = 32 + 8 + 2 → 00101010
# Binaire → Hexa (0010 1010)₂ = 0x2A
2) Entiers signés : complément à 2
Sur n bits, les entiers signés vont de −2^(n−1) à 2^(n−1)−1. Exemple sur 8 bits : −128 à 127. Le bit de poids fort sert au signe.
# Python (int est en précision arbitraire, mais on peut simuler 8 bits)
(x + y) & 0xFF # garde 8 bits
(~x + 1) & 0xFF # complément à 2 (−x) sur 8 bits
3) Virgule flottante : précision et arrondis (IEEE 754)
Un float (double précision) stocke un signe, un exposant et une mantisse. Il n’y a pas de représentation exacte pour la plupart des décimaux (ex. 0,1), d’où des erreurs d’arrondi.
# Python
0.1 + 0.2 == 0.3 # False
abs((0.1 + 0.2) - 0.3) < 1e-12 # comparaison avec tolérance
4) Booléens & logique
- Deux valeurs :
True,False. - Opérateurs :
and,or,not. - Table de vérité : combinaisons des opérateurs sur deux booléens.
# Python
x = True; y = False
x and y # False
x or y # True
not x # False
5) Chaînes & encodage (ASCII, Unicode, UTF‑8)
- ASCII : 128 caractères (7 bits). Limité.
- Unicode : code points universels (ex. U+00E9 = é).
- UTF‑8 : encodage de ces points en 1–4 octets.
# Python
s = "é" # caractère Unicode
len(s) # 1 (caractère)
len(s.encode('utf-8')) # 2 (octets)
"é".encode('utf-8') # b'\xc3\xa9'
6) Types en Python : résumé
| Type | Exemples | Conversions utiles | Notes |
|---|---|---|---|
int | 0, -5, 2**63 | int("42"), int(3.0) | Précision arbitraire en Python |
float | 3.14, 1e-9 | float("2.5"), float(3) | IEEE 754 (arrondis) |
bool | True, False | bool(0)→False, bool(42)→True | 0=Faux, ≠0=Vrai (dans un test) |
str | "NSI", "é" | str(42), "A".encode("utf-8") | UTF‑8 conseillé pour les fichiers |
Astuce : type(x) affiche le type de x. isinstance(x, int) teste l’appartenance à un type.
Exercices d’application
Travail en binôme. Justifiez vos réponses, montrez vos étapes de conversion et testez vos hypothèses avec de courts scripts Python.
A) Conversions & bases
- Convertir en binaire puis en hexadécimal : 13, 42, 255, 512.
- Convertir en décimal : (101101)₂, (1100 0110)₂, 0x2A, 0xFF.
- Compléter : 1 octet = … bits ; 1 KiB = … octets ; 1 MiB = … KiB.
- Écrire la suite de bits pour 0xAF et 0x3C (sur 1 octet).
# Script d’aide (facultatif)
# Entrer un entier et afficher binaire/hexadécimal
n = int(input("n = "))
print(bin(n), hex(n))
B) Entiers signés
- Sur 8 bits, donner l’intervalle des entiers signés.
- Donner la représentation sur 8 bits de −1, −42 en complément à 2.
- Montrer un exemple d’overflow en additionnant deux entiers sur 8 bits.
- (Défi) Écrire une fonction Python qui simule l’addition sur 8 bits (modulo 256).
# Aide
# (-x) sur 8 bits : (~x + 1) & 0xFF
C) Virgule flottante
- Tester en Python :
0.1 + 0.2 == 0.3. Expliquer le résultat. - Proposer une manière correcte de comparer deux float.
- Donner un exemple de calcul simple où l’ordre des opérations change légèrement le résultat en float.
# Aide
abs((a - b)) < 1e-12 # tolérance
D) Chaînes & encodage
- Donner le code point Unicode de « é » (notation U+…)
- Afficher en Python la longueur en caractères et en octets de « école » en UTF‑8.
- Pourquoi UTF‑8 est‑il qualifié de « à longueur variable » ? Donner un exemple.
# Aide
s = "école"
print(len(s), len(s.encode('utf-8')))
Mini‑projets (prochainement)
Ressources & fiches mémo
| Thème | Contenu | Exemple |
|---|---|---|
| Bases | Puissances de 2, bits, octets, conversion | 0x2A = 42 |
| Entiers | Complément à 2, bornes | 8 bits : −128…127 |
| Floats | IEEE 754, arrondis | 0.1+0.2 ≠ 0.3 |
| Chaînes | Unicode, UTF‑8, bytes | "é" → b'\xC3\xA9' |
Pensez à documenter vos essais dans un petit carnet de bord : conversions, cas limites, résultats inattendus.