Le complément à deux est partout dans les ordinateurs, des microcontrôleurs aux processeurs de serveurs. Pourtant, cette méthode de représentation des nombres négatifs en binaire reste souvent abstraite au premier abord. Son intérêt est très concret : elle permet aux machines de calculer vite, simplement et de manière fiable avec des entiers signés.
Pourquoi utiliser le complément à deux en binaire ?
En informatique, les données sont stockées sous forme de bits, c’est-à-dire de 0 et de 1. Pour représenter des nombres positifs, le binaire classique suffit : 5 s’écrit 0101 sur 4 bits, 12 s’écrit 1100. La difficulté apparaît lorsqu’il faut représenter des nombres négatifs. Un ordinateur doit pouvoir manipuler -1, -25 ou -128 aussi efficacement que 1, 25 ou 128.
Le complément à deux répond à ce besoin. Il s’agit d’une convention utilisée pour coder les entiers signés, c’est-à-dire les nombres pouvant être positifs ou négatifs. Sa force tient à une idée simple : les additions et les soustractions peuvent être réalisées avec le même circuit matériel, sans traitement séparé pour le signe. Cela a fait du complément à deux le standard de fait dans la plupart des architectures modernes.
Le problème initial : représenter le signe avec des bits
Un bit ne peut prendre que deux valeurs. Il semble donc naturel de réserver un bit pour le signe : 0 pour positif, 1 pour négatif. Avec cette méthode, appelée signe et valeur absolue, +5 peut s’écrire 0101 sur 4 bits et -5 peut s’écrire 1101. Le premier bit indique le signe, les trois autres indiquent la valeur.
Cette approche paraît intuitive, mais elle complique les calculs. Additionner deux nombres ne se résume plus à additionner des bits. Le processeur doit examiner les signes, comparer les valeurs absolues, choisir entre addition et soustraction, puis attribuer le bon signe au résultat. Pour du calcul électronique, cela signifie davantage de logique, plus de cas particuliers et potentiellement plus de risques d’erreur.
Autre inconvénient : cette représentation produit deux zéros. Sur 4 bits, +0 vaut 0000 et -0 vaut 1000. Mathématiquement, il n’existe qu’un seul zéro. En machine, cette duplication oblige à prévoir des traitements supplémentaires pour comparer des valeurs ou tester si un résultat est nul. Le complément à deux élimine cette ambiguïté.
Comment fonctionne le complément à deux
Le principe du complément à deux consiste à représenter un nombre négatif en inversant les bits de sa valeur positive, puis en ajoutant 1. Prenons un exemple sur 8 bits. Le nombre 5 s’écrit 00000101. On inverse les bits : 11111010. On ajoute 1 : 11111011. Ainsi, sur 8 bits, -5 est codé par 11111011.
Cette méthode peut sembler artificielle, mais elle repose sur une propriété arithmétique solide. Sur 8 bits, il existe 256 combinaisons possibles, de 00000000 à 11111111. Le complément à deux organise ces combinaisons comme un cycle. Les valeurs de 00000000 à 01111111 représentent 0 à 127. Les valeurs de 10000000 à 11111111 représentent -128 à -1.
Le bit de poids fort, situé le plus à gauche, indique donc indirectement le signe. S’il vaut 0, le nombre est positif ou nul. S’il vaut 1, le nombre est négatif. Mais ce bit n’est pas un simple indicateur séparé : il fait partie du calcul. C’est ce qui donne au complément à deux son efficacité.
Une arithmétique plus simple pour les processeurs
Le principal avantage du complément à deux est de permettre une addition uniforme. Le même additionneur binaire peut traiter des nombres positifs, négatifs ou mixtes. Par exemple, sur 8 bits, additionnons 5 et -5. On a 00000101 pour 5 et 11111011 pour -5. La somme donne 1 00000000. Le neuvième bit dépasse la capacité de stockage et est ignoré. Le résultat conservé est 00000000, soit zéro.
Cette règle peut surprendre, mais elle est cohérente dans un système à taille fixe. Les processeurs travaillent avec des registres de 8, 16, 32 ou 64 bits. Lorsqu’un résultat dépasse cette taille, les bits excédentaires sont traités selon des règles bien définies. En complément à deux, ignorer la retenue finale dans une addition signée donne souvent le résultat attendu dans l’espace de représentation prévu.
La soustraction devient elle aussi plus simple. Calculer 7 - 3 revient à additionner 7 et -3. Sur 8 bits, 7 vaut 00000111. Le nombre -3 vaut 11111101. La somme est 1 00000100 ; en supprimant la retenue finale, on obtient 00000100, soit 4. Le processeur n’a donc pas besoin d’un circuit radicalement différent pour soustraire.
Un choix dicté par le matériel électronique
Les circuits numériques sont conçus pour exécuter des opérations logiques et arithmétiques à grande vitesse. Moins il y a de cas particuliers, plus le matériel peut être compact, rapide et prévisible. Le complément à deux réduit la complexité des unités arithmétiques et logiques, souvent appelées ALU, qui sont au cœur des processeurs.
Cette simplicité a joué un rôle important dans l’histoire de l’informatique. Les premiers ordinateurs utilisaient parfois d’autres représentations des entiers signés, comme le complément à un ou le signe et valeur absolue. Mais le complément à deux s’est imposé parce qu’il permettait de rationaliser les circuits. Dans un composant électronique, économiser des portes logiques peut réduire la consommation, la surface de silicium et les délais de propagation.
Les briques élémentaires de la logique numérique, comme les bascules, les registres et les additionneurs, reposent sur des états binaires stables. Le fonctionnement d’une mémoire élémentaire synchronisée par une horloge illustre bien cette logique : stocker et transmettre des bits de façon fiable est indispensable pour manipuler correctement des nombres codés en complément à deux.
Des plages de valeurs asymétriques mais utiles
Le complément à deux présente une particularité : la plage des valeurs négatives contient une valeur de plus que la plage des valeurs positives. Sur 8 bits, on peut représenter les entiers de -128 à +127. Sur 16 bits, la plage va de -32768 à +32767. Sur 32 bits, elle s’étend de -2147483648 à +2147483647.
Cette asymétrie vient du fait qu’il n’existe qu’un seul zéro. Les 256 combinaisons possibles sur 8 bits doivent être réparties entre les valeurs négatives, zéro et les valeurs positives. Comme zéro occupe une combinaison, il reste un nombre impair de combinaisons à répartir. Le système attribue donc une valeur supplémentaire au côté négatif.
Dans la pratique, cette asymétrie est rarement problématique, mais elle doit être connue. Elle explique par exemple pourquoi, dans de nombreux langages de programmation, la valeur minimale d’un entier signé ne peut pas toujours être transformée en valeur positive sans débordement. Sur 8 bits, +128 n’existe pas, alors que -128 existe.
Comprendre le débordement arithmétique
Le complément à deux ne rend pas les entiers illimités. Un calcul peut dépasser la plage représentable. C’est ce qu’on appelle un débordement arithmétique, ou overflow. Sur 8 bits signés, additionner 100 et 50 devrait donner 150. Or 150 n’est pas représentable, puisque la limite positive est 127.
En binaire, 100 vaut 01100100 et 50 vaut 00110010. Leur somme donne 10010110. Interprétée comme un entier signé en complément à deux, cette combinaison correspond à -106, pas à 150. Le résultat semble absurde si l’on oublie la contrainte de taille. Il est pourtant parfaitement explicable : les bits disponibles ont été dépassés.
Les processeurs disposent de drapeaux d’état pour signaler ce type de situation. Les compilateurs, systèmes d’exploitation et langages de programmation n’interprètent pas tous ces débordements de la même façon. En C, par exemple, le débordement d’un entier signé est un comportement non défini selon le standard, tandis que certains environnements contrôlés le détectent explicitement. Comprendre le complément à deux aide donc à interpréter des bugs parfois difficiles à repérer.
Décalages, masques et opérations bit à bit
Le complément à deux influence aussi les opérations bit à bit. Un décalage vers la gauche correspond souvent à une multiplication par deux, tant qu’il n’y a pas de débordement. Par exemple, 00000110 représente 6 ; décalé à gauche, il devient 00001100, soit 12. Cette propriété est exploitée dans de nombreux calculs bas niveau.
Le décalage vers la droite est plus délicat pour les nombres négatifs. Dans un décalage arithmétique, le bit de signe est recopié afin de conserver le signe du nombre. Ainsi, 11111000, qui représente -8 sur 8 bits, devient 11111100 après un décalage arithmétique vers la droite, soit -4. Un décalage logique, lui, insérerait des zéros à gauche, ce qui changerait l’interprétation signée.
Ces mécanismes sont liés au déplacement contrôlé des bits dans les circuits numériques. Les circuits capables de faire circuler une information binaire montrent comment les valeurs peuvent être déplacées, stockées et transformées, ce qui explique l’importance pratique des décalages dans le calcul binaire.
Pourquoi ce standard reste incontournable
Le complément à deux s’est imposé parce qu’il combine trois qualités essentielles : une représentation unique du zéro, une arithmétique cohérente et une mise en œuvre matérielle efficace. Ces avantages sont encore déterminants dans les architectures contemporaines, y compris lorsque les processeurs manipulent des données beaucoup plus complexes que de simples entiers.
Pour les développeurs, les électroniciens et les étudiants, le comprendre permet de mieux lire les valeurs binaires, d’anticiper les limites des entiers et d’analyser les erreurs liées aux dépassements de capacité. Il éclaire aussi des comportements courants : pourquoi -1 apparaît souvent comme une suite de bits à 1, pourquoi une conversion entre types signés et non signés peut produire un résultat inattendu, ou pourquoi certaines optimisations reposent sur des décalages.
Le complément à deux n’est donc pas seulement une astuce de codage. C’est une convention centrale de l’informatique moderne, née de contraintes matérielles très concrètes et toujours pertinente dans les logiciels actuels. En rendant les nombres négatifs compatibles avec l’addition binaire ordinaire, il a contribué à rendre les machines plus simples, plus rapides et plus fiables.