Calculateur de complément à deux (conversion binaire d'entiers signés)

Convertit un entier décimal signé en son motif binaire en complément à deux sur 8/16/32/64 bits, ou effectue la conversion inverse. Affiche aussi l'interprétation non signée, la notation hexadécimale, et détecte les valeurs hors plage.

Astuces

  • Un entier signé sur 8 bits va de -128 à 127. Essayez de saisir 127 puis 128 pour observer la limite du dépassement de capacité en action : 128 ne rentre pas et déclenche l'erreur de plage, exactement là où se produirait le basculement vers -128.
  • La ligne « décimal non signé » lit le même motif de bits sans traiter le bit de poids fort comme un signe. La comparer avec la ligne signée rend immédiatement visible la différence entre les deux interprétations.
  • Une entrée binaire doit comporter exactement autant de chiffres que la largeur de bits sélectionnée : 8 chiffres pour 8 bits, 16 pour 16 bits, et ainsi de suite.
  • Les calculs sur 64 bits utilisent BigInt en interne plutôt que le type Number de JavaScript, si bien que les valeurs proches de 2^63 sont converties sans aucune perte de précision.
  • Cet outil est aussi utile pour comprendre le comportement de dépassement de capacité des entiers dans des langages comme C et Java, où les types int (32 bits) et long (64 bits) basculent exactement à ces mêmes limites.

Questions fréquentes

La représentation signe-magnitude et le complément à un aboutissent tous deux à deux motifs de bits distincts pour zéro (« +0 » et « -0 »), ce qui complique les circuits de comparaison et d'arithmétique. Le complément à deux ne possède qu'un seul motif de bits pour zéro et, tout aussi important, le même circuit additionneur qui effectue l'addition peut aussi effectuer la soustraction. Ces deux propriétés permettent aux concepteurs de processeurs de simplifier l'unité arithmétique et logique, raison pour laquelle presque tous les processeurs modernes utilisent en interne le complément à deux pour les entiers signés.

De -128 à 127. Comme le bit de poids fort est réservé au signe, seuls 128 motifs distincts existent côté positif (0 à 127), mais le côté négatif peut représenter 128 valeurs distinctes (-1 à -128), car le complément à deux ne possède qu'un seul motif de bits pour zéro, laissant un motif supplémentaire disponible côté négatif — d'où la plage asymétrique.

Le complément à un forme un nombre négatif en inversant simplement chaque bit de la valeur positive. Le complément à deux va un cran plus loin en ajoutant 1 après l'inversion. Cette étape supplémentaire élimine le « problème des deux zéros » inhérent au complément à un (00000000 pour « +0 » et 11111111 pour « -0 »), ce qui explique pourquoi le complément à deux est devenu la norme.

Comme la largeur de bits est fixe, tout résultat arithmétique dépassant la plage représentable voit son bit de poids fort tronqué, ce qui change la signification du bit de signe. Par exemple, ajouter 1 au maximum signé sur 8 bits, 127, produit le motif de bits 10000000, interprété comme -128 selon les règles signées. Dépasser la limite supérieure vous ramène à la limite inférieure ; ce saut contre-intuitif est exactement ce qu'est le dépassement de capacité.

Le motif de bits lui-même ne change pas, mais sans traiter le bit de poids fort comme un signe, chaque bit apporte simplement sa valeur positionnelle habituelle. Par exemple, le motif sur 8 bits 11111011 vaut -5 lu en signé, mais 251 lu en non signé. Cette réinterprétation exacte se produit en pratique chaque fois que vous utilisez un type « non signé », comme unsigned int en C, sur une valeur auparavant traitée comme signée.
ツールくん

Anecdote — Pourquoi les ordinateurs utilisent le complément à deux

Le complément à deux n'est pas la seule façon de représenter des nombres négatifs en binaire. La représentation signe-magnitude (où seul le bit de poids fort sert d'indicateur de signe) et le complément à un (qui inverse simplement les bits d'un nombre positif) ont tous deux été utilisés historiquement. Les deux partagent un même défaut : ils aboutissent à deux motifs de bits distincts pour zéro, « +0 » et « -0 », ce qui complique la logique de comparaison et la conception des circuits. Le complément à deux évite entièrement ce « problème des deux zéros » : chaque motif de bits correspond exactement à une valeur entière.

Un avantage encore plus important du complément à deux est que le même circuit additionneur utilisé pour l'addition peut aussi effectuer la soustraction, puisque soustraire un nombre revient à additionner son complément à deux. Le processeur n'a pas besoin de savoir ni de se soucier qu'une valeur soit positive ou négative : il additionne simplement des motifs de bits et obtient le bon résultat dans les deux cas. Cela permet à l'unité arithmétique et logique (UAL) de se passer complètement d'un circuit de soustraction dédié, raison pour laquelle pratiquement toutes les architectures de processeurs modernes ont adopté le complément à deux pour les entiers signés.

Le dépassement de capacité des entiers est une conséquence directe de cette représentation. Ajouter 1 au maximum signé sur 8 bits, 127 (01111111), fait simplement basculer le motif de bits vers 10000000, qui, interprété comme une valeur signée, vaut -128. En C, le dépassement de capacité d'un entier signé est techniquement un comportement indéfini, ce qui signifie que les optimisations du compilateur peuvent produire des résultats surprenants près de cette limite, méritant donc une réelle prudence en code de production. Java, en revanche, précise que le dépassement bascule silencieusement, un exemple intéressant de la façon dont les garanties de comportement peuvent différer entre langages même lorsque la représentation binaire sous-jacente est identique.