Combien vaut −5 en complément à deux sur 8 bits ?
11111011 11111011, soit 0xFB.
Saisissez un entier signé et obtenez d'un coup signe-valeur absolue, complément à un, complément à deux et binaire décalé, de 4 à 64 bits. Ou collez un motif de bits ou un octet hexadécimal et lisez les cinq interprétations.
Saisissez un nombre entier signé. Les quatre représentations sont calculées d'un coup — vous n'avez pas besoin de savoir à l'avance laquelle votre système utilise.
| Encodage | Bits | Hex |
|---|---|---|
| Signe-valeur absolue | 1000 0101 | 85 |
| Complément à un | 1111 1010 | FA |
| Complément à deux | 1111 1011 | FB |
| Binaire décalé | 0111 1011 | 7B |
Le signe-valeur absolue et le complément à un dépensent chacun un motif de bits pour le zéro négatif, ils contiennent donc une valeur de moins que le complément à deux et n'atteignent pas le nombre le plus négatif.
Vous avez trouvé un octet dans un dump mémoire ou un registre et vous ne savez pas comment il doit être lu. Collez-le et voyez d'un coup ce qu'il signifie sous chaque interprétation — laquelle est la bonne dépend du système qui l'a produit, donc toutes sont affichées.
| Lu comme | Valeur |
|---|---|
| Non signé | 251 |
| Signe-valeur absolue | -123 |
| Complément à un | -4 |
| Complément à deux | -5 |
| Binaire décalé | 123 |
Calculée par le moteur qu'utilise l'outil ci-dessus, ces valeurs ne peuvent donc pas s'en écarter.
| Décimal | Signe-valeur absolue | Complément à un | Complément à deux | Binaire décalé | Hex |
|---|---|---|---|---|---|
| 127 | 0111 1111 | 0111 1111 | 0111 1111 | 1111 1111 | 7F |
| 100 | 0110 0100 | 0110 0100 | 0110 0100 | 1110 0100 | 64 |
| 10 | 0000 1010 | 0000 1010 | 0000 1010 | 1000 1010 | 0A |
| 5 | 0000 0101 | 0000 0101 | 0000 0101 | 1000 0101 | 05 |
| 1 | 0000 0001 | 0000 0001 | 0000 0001 | 1000 0001 | 01 |
| 0 | 0000 0000 | 0000 0000 | 0000 0000 | 1000 0000 | 00 |
| -1 | 1000 0001 | 1111 1110 | 1111 1111 | 0111 1111 | FF |
| -5 | 1000 0101 | 1111 1010 | 1111 1011 | 0111 1011 | FB |
| -10 | 1000 1010 | 1111 0101 | 1111 0110 | 0111 0110 | F6 |
| -100 | 1110 0100 | 1001 1011 | 1001 1100 | 0001 1100 | 9C |
| -127 | 1111 1111 | 1000 0000 | 1000 0001 | 0000 0001 | 81 |
| -128 | — | — | 1000 0000 | 0000 0000 | 80 |
| Largeur | Complément à deux / binaire décalé | Signe-valeur absolue / complément à un |
|---|---|---|
| 4 | -8 … 7 | -7 … 7 |
| 8 | -128 … 127 | -127 … 127 |
| 16 | -32768 … 32767 | -32767 … 32767 |
| 32 | -2147483648 … 2147483647 | -2147483647 … 2147483647 |
| 64 | -9223372036854775808 … 9223372036854775807 | -9223372036854775807 … 9223372036854775807 |
Conçu et vérifié par l'équipe d'ingénierie Go Tools.
11111011 11111011, soit 0xFB.
-128 … 127 −128 à 127 en complément à deux ; −127 à 127 en signe-valeur absolue et en complément à un.
valeur − 2^n Si le bit de poids fort vaut 0, lisez-le comme non signé ; s'il vaut 1, soustrayez 2^n de la lecture non signée.
−1 ou 255 −1 en octet signé, 255 en octet non signé. Les bits seuls ne le décident pas.
Le complément à deux répond à une question de matériel, pas de mathématiques : comment stocker les nombres négatifs pour que l'additionneur déjà construit continue de fonctionner ? L'astuce consiste à représenter −x par le motif de 2^n − x. L'addition boucle alors modulo 2^n et tombe sur la bonne réponse sans aucun cas particulier lié au signe, ce qui évite d'avoir à câbler un circuit distinct pour la soustraction.
Deux conséquences en découlent et toutes deux apparaissent dans de vrais bugs. D'abord, la plage est dissymétrique : huit bits couvrent −128 à 127, pas −128 à 128, parce qu'il faut bien répartir les motifs et qu'il n'y a pas de zéro négatif pour équilibrer les deux côtés. Ensuite, le signe n'est pas un drapeau que l'on peut retirer — le bit de poids fort de 11111011 vaut 1, mais la valeur est −5 et non −123, donc lire un nombre négatif suppose d'interpréter le mot entier, pas un seul bit.
Le signe-valeur absolue et le complément à un sont les deux conceptions qui ont perdu. Elles méritent encore d'être connues parce que la virgule flottante IEEE 754 a gardé la disposition signe-valeur absolue, et parce que c'est cette comparaison qui fait paraître le complément à deux inévitable plutôt qu'arbitraire.
// -5 as an 8-bit byte, three ways to arrive at the same pattern 0b00000101 // 5 ~0b00000101 // 11111010 ones' complement of 5 ~0b00000101 + 1 // 11111011 two's complement = -5 // In JavaScript the width matters: bitwise operators are 32-bit, // so anything wider has to go through BigInt. BigInt.asIntN(8, 0xFBn) // -5n BigInt.asUintN(8, -5n) // 251n BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n // C23 made two's complement mandatory for signed integers. // Before that, the other two encodings were legal but unused.
Signe-valeur absolue, complément à un, complément à deux et binaire décalé sont calculés ensemble. Le binaire décalé est celui que la plupart des calculateurs omettent, et c'est celui que les fiches techniques d'ADC continuent d'employer.
Collez les bits ou l'hexadécimal que vous avez sous la main et lisez les cinq interprétations, non signé compris. C'est le sens dont vous avez besoin quand un dump contredit le nombre annoncé par l'appareil.
Chaque valeur passe par BigInt, donc 0xFFFFFFFFFFFFFF9C donne bien −100 et non le résultat d'une troncature à 32 bits.
Sur 8 bits, −128 n'a ni forme signe-valeur absolue ni forme complément à un. Le tableau le dit au lieu d'imprimer un motif qui ne désigne pas ce nombre.
Saisissez 0 et le second motif de bits du zéro en signe-valeur absolue et en complément à un s'affiche, ce qui reste l'argument le plus clair en faveur du complément à deux.
Le tableau comparatif 8 bits et les plages par largeur sont rendus à la construction de la page, par le moteur qui alimente les champs interactifs, si bien qu'ils ne peuvent pas s'en écarter.
BigInt.asIntN, le int.from_bytes(..., signed=True) de Python et les types de largeur fixe de C donnent la réponse faisant autorité pour le code que vous écrivez. Utilisez-les dans le code ; utilisez cette page quand vous avez une valeur sous les yeux et aucun interpréteur ouvert.
Elle affiche la valeur avec le type déclaré par le programme, c'est-à-dire exactement l'information qui manque à un motif de bits. Elle ne sert plus quand les octets sont arrivés par un lien sans type déclaré — c'est ce cas-là que cette page traite.
Il convertit entre bases, mais seulement pour des valeurs positives ou nulles — les négatifs y sont explicitement refusés, car une base n'a aucun avis sur la façon dont un signe est stocké. La représentation signée est le travail de cette page ; le convertisseur de base s'occupe des valeurs absolues.
Le pendant en virgule flottante. Il conserve une disposition signe-valeur absolue plutôt qu'un complément à deux et décale l'exposant de 2^(e−1)−1, donc les deux pages répondent à des questions différentes sur le même mot mémoire.
-5, largeur 8
signe-valeur absolue 1000 0101 complément à un 1111 1010 complément à deux 1111 1011 (0xFB) binaire décalé 0111 1011
Les trois encodages s'accordent sur le bit de signe et divergent sur tout le reste. Seule la ligne du complément à deux correspond à ce que contient réellement un int8_t en C.
0xFB, largeur 8
non signé 251 signe-valeur absolue -123 complément à un -4 complément à deux -5 binaire décalé 123
-128, largeur 8
signe-valeur absolue aucune représentation complément à un aucune représentation complément à deux 1000 0000 (0x80) binaire décalé 0000 0000
Le signe-valeur absolue et le complément à un dépensent chacun un motif de bits pour le zéro négatif : ils vont donc de −127 à 127 et n'atteignent pas −128. Les outils qui affichent un octet ici se trompent.
0xFFFFFFFFFFFFFF9C, largeur 64
complément à deux -100 non signé 18446744073709551516
Tout ce qui dépasse 32 bits doit passer par BigInt. Les opérateurs |, << et >>> de JavaScript tronquent silencieusement à 32 bits, d'où la réponse fausse — et non l'erreur — que renvoient ici certains calculateurs en ligne.
4, 8, 16, 32 ou 64. Ce n'est pas une préférence d'affichage : les mêmes bits désignent des nombres différents selon la largeur, se tromper change donc la réponse.
Tapez un nombre entier, signe négatif compris. Les quatre encodages se mettent à jour au fil de la frappe, chacun accompagné de sa forme hexadécimale.
Collez une chaîne binaire ou une valeur 0x dans le champ de décodage pour voir ce que ce motif exact signifie sous chaque interprétation, lecture non signée comprise.
La page signale les deux cas qui piègent tout le monde : la valeur la plus négative n'a ni forme signe-valeur absolue ni forme complément à un, et le zéro possède un second motif de bits dans ces deux encodages.
Inverser les bits donne le complément à un. S'arrêter là décale d'une unité par rapport au complément à deux, et l'erreur passe facilement inaperçue parce que le résultat ressemble toujours à un nombre négatif plausible.
5 = 00000101 ~5 = 11111010 <- ones' complement, not -5
5 = 00000101 ~5 = 11111010 ~5 + 1 = 11111011 <- -5 in two's complement
JavaScript tronque à 32 bits les opérandes des opérateurs bit à bit. La moitié haute disparaît sans erreur, donc le résultat est faux plutôt qu'absent.
0xFFFFFFFFFFFFFFFB // 18446744073709552000 -- the literal is already rounded ~0xFFFFFFFFFFFFFFFB + 1 // 0 -- silently wrong, expected -5
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n
Élargir en complétant par des zéros ne conserve le nombre que s'il est positif. Pour une valeur négative, le bit de signe doit être recopié sur tous les nouveaux bits.
int8 0xFB (-5) int16 0x00FB (251) <- zero-extended
int8 0xFB (-5) int16 0xFFFB (-5) <- sign-extended
Sur huit bits, −128 n'a ni représentation signe-valeur absolue ni représentation complément à un, parce que ces deux encodages dépensent chacun un motif pour le zéro négatif. Lui imprimer 10000000, c'est confondre la réponse du complément à deux avec un encodage incapable d'exprimer ce nombre.
-128 sign-magnitude: 10000000 <- that pattern means -0
-128 sign-magnitude: no representation at width 8 -128 two's complement: 10000000
0xFF9C. En non signé cela fait 65436, ce qui n'est pas une température. Sur une largeur de 16, la ligne complément à deux donne −100, et avec un facteur d'échelle de 0,1 °C le capteur annonce −10,0 °C.n−1 bits restants portent la valeur absolue, lue comme un simple nombre non signé. La plage va de −(2^(n−1)−1) à 2^(n−1)−1, symétrique, avec deux zéros. C'est la disposition retenue par IEEE 754 pour la virgule flottante.2^n − 1 − x. Même plage et mêmes deux zéros qu'en signe-valeur absolue. L'addition exige une retenue circulaire, précisément la complication que le complément à deux supprime. En anglais la place de l'apostrophe n'est pas une coquille : ones' complement se rapporte à un mot entièrement à 1, tandis que two's complement se rapporte à une seule puissance de deux.−x est stockée sous la forme 2^n − x. La plage va de −2^(n−1) à 2^(n−1)−1, délibérément dissymétrique, avec un seul zéro. L'addition, la soustraction et la multiplication du mot de poids faible ignorent toutes le signe, et c'est toute la raison de sa victoire.valeur + 2^(n−1), donc −2^(n−1) devient tout à zéro et les motifs se trient dans le même ordre que les valeurs qu'ils encodent. Cela revient au motif du complément à deux dont on inverse le bit de poids fort. Méfiez-vous du vocabulaire : les champs d'exposant IEEE 754 sont décalés de 2^(e−1)−1, une unité de moins que le décalage utilisé ici.&, |, ~ et des décalages en entiers 32 bits avant l'opération puis reconvertit ensuite, donc une valeur 64 bits perd sa moitié haute sans qu'aucune erreur ne soit levée. Toutes les conversions de cette page se font sur des entiers de précision arbitraire, ce qui explique aussi l'exactitude des extrêmes 64 bits.−(−128) vaut encore −128 pour un octet signé. Tout code qui calcule une valeur absolue doit prévoir cette entrée, et toute suite de tests devrait la contenir.0xFB 8 bits dans un champ 16 bits sous la forme 0x00FB transforme −5 en 251. Élargir une valeur signée suppose de recopier le bit de signe, ce qui donne 0xFFFB.BigInt.asIntN en JavaScript, int.from_bytes(..., signed=True) en Python et les types de largeur fixe en C disent ce qu'ils font et gèrent les bords. Les ~x + 1 écrits à la main sont la source des bugs de largeur.2^n − x, ce qui permet à l'addition et à la soustraction de partager le même circuit et ne laisse qu'un seul zéro sur la droite numérique. 00000101 → 11111010 → 11111011. L'inversion seule donne le complément à un, ce qui explique pourquoi les deux ne diffèrent jamais que de 1. n bits il couvre −2^(n−1) à 2^(n−1)−1, parce qu'il ne gaspille pas un motif pour le zéro négatif comme le font le signe-valeur absolue et le complément à un. La case ainsi gagnée tombe du côté négatif. int8_t ou à votre uint8_t. valeur + 2^(n−1), si bien que la plus petite valeur devient tout à zéro et que trier les motifs bruts comme des entiers non signés trie aussi les valeurs signées. On le trouve en sortie de convertisseurs ADC et DAC et dans certains formats d'échantillons audio. Attention, les exposants IEEE 754 utilisent un autre décalage — 2^(e−1)−1, pas 2^(e−1) — ne transposez pas le nombre d'un cas à l'autre. 65436 alors que l'appareil voulait dire la valeur −100 en complément à deux. Collez ici 65436 sous forme hexadécimale 0xFF9C avec une largeur de 16 et la ligne complément à deux donne la lecture visée. ~x + 1 perd silencieusement la moitié haute d'une valeur 64 bits et affiche un résultat plausible mais faux. Cet outil travaille de bout en bout avec BigInt, d'où l'accord des lignes 64 bits avec ce qu'affiche votre débogueur. 00000000 et 10000000 signifient tous deux zéro ; en complément à un, ce sont 00000000 et 11111111. Deux comparaisons qui devraient être égales peuvent donc différer bit à bit. Le complément à deux n'a qu'un seul zéro, ce qui a supprimé toute une classe de cas particuliers matériels. Outils de conversion
Convertissez entre binaire, hexadécimal, décimal, octal et toute base (2-36) instantanément. Gratuit, privé, 100 % dans votre navigateur.
Outils de conversion
Convertissez les permissions de fichiers Linux entre octal (755, 644) et symboles rwx. Obtenez les commandes chmod, repérez les réglages risqués comme 777 — gratuit, directement dans votre navigateur.
Outils de conversion
Convertissez HEX en RGB, HSL, OKLCH, OKLAB et CMYK dans votre navigateur — copiez n'importe quel format en un clic. Gratuit, sans inscription, vos couleurs ne quittent jamais la page.
Outils de conversion
Convertissez n'importe quelle couleur HEX en CMYK dans votre navigateur. Approximation naïve basée sur sRGB pour les aperçus d'impression. Gratuit, instantané, sans inscription, vos couleurs restent locales.
Outils de conversion
Convertissez n'importe quelle couleur hex en HSL dans votre navigateur — hex à 3, 6 et 8 chiffres avec alpha pris en charge. Gratuit, instantané, sans inscription, vos couleurs ne quittent jamais la page.
Outils de conversion
Convertissez HEX en OKLCH pour les tokens de design Tailwind v4. Sortie perceptuellement uniforme en direct avec alertes de gamut chromatique Display P3. Gratuit, dans le navigateur.