Quanto vale −5 in complemento a due a 8 bit?
11111011 11111011, cioè 0xFB.
Digita un intero con segno e ottieni insieme modulo e segno, complemento a uno, complemento a due e binario con offset, da 4 a 64 bit. Oppure incolla dei bit o un byte esadecimale e leggi tutte e cinque le letture affiancate.
Digita un numero intero con segno. Le quattro rappresentazioni vengono calcolate insieme: non devi sapere in anticipo quale usa il tuo sistema.
| Codifica | Bit | Esadecimale |
|---|---|---|
| Modulo e segno | 1000 0101 | 85 |
| Complemento a uno | 1111 1010 | FA |
| Complemento a due | 1111 1011 | FB |
| Binario con offset | 0111 1011 | 7B |
Modulo e segno e complemento a uno spendono ciascuno un pattern di bit per lo zero negativo, quindi contengono un valore in meno del complemento a due e non arrivano al numero più negativo.
Hai trovato un byte in un dump di memoria o in un registro e non sai come vada letto. Incollalo e vedi che cosa significa sotto ogni interpretazione in una volta sola: quale sia quella giusta dipende dal sistema che l'ha prodotto, perciò qui ci sono tutte.
| Letto come | Valore |
|---|---|
| Senza segno | 251 |
| Modulo e segno | -123 |
| Complemento a uno | -4 |
| Complemento a due | -5 |
| Binario con offset | 123 |
Calcolata dallo stesso motore usato dallo strumento qui sopra, quindi questi valori non possono divergere da esso.
| Decimale | Modulo e segno | Complemento a uno | Complemento a due | Binario con offset | Esadecimale |
|---|---|---|---|---|---|
| 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 |
| Larghezza | Complemento a due / binario con offset | Modulo e segno / complemento a uno |
|---|---|---|
| 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 |
Realizzato e verificato dal team di ingegneria di Go Tools.
11111011 11111011, cioè 0xFB.
-128 … 127 Da −128 a 127 in complemento a due; da −127 a 127 in modulo e segno e in complemento a uno.
valore − 2^n Se il bit più alto è 0 leggilo come senza segno; se è 1, sottrai 2^n dalla lettura senza segno.
−1 o 255 −1 come byte con segno, 255 come byte senza segno. I bit da soli non lo decidono.
Il complemento a due risponde a una domanda hardware, non matematica: come si memorizzano i numeri negativi in modo che il sommatore già costruito continui a funzionare? Il trucco è rappresentare −x con il pattern di 2^n − x. L'addizione allora avvolge modulo 2^n e cade sul risultato giusto senza alcun caso speciale per i segni, ed è per questo che la sottrazione non richiede un circuito separato.
Ne seguono due conseguenze, entrambe visibili in bug reali. Primo, l'intervallo è asimmetrico: otto bit coprono da −128 a 127, non da −128 a 128, perché i pattern vanno ripartiti e non c'è uno zero negativo a pareggiare i conti. Secondo, il segno non è un flag che puoi staccare: il bit più alto di 11111011 è 1, ma il valore è −5 e non −123, quindi leggere un numero negativo significa interpretare l'intera parola, non guardare un bit solo.
Modulo e segno e complemento a uno sono i due progetti che hanno perso. Vale ancora la pena conoscerli, perché la virgola mobile IEEE 754 ha conservato il layout in modulo e segno e perché è il confronto a far sembrare il complemento a due inevitabile anziché arbitrario.
// -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.
Modulo e segno, complemento a uno, complemento a due e binario con offset vengono calcolati insieme. Il binario con offset è quello che la maggior parte dei calcolatori tralascia, ed è proprio quello che i datasheet degli ADC continuano a usare.
Incolla i bit o l'esadecimale che hai davvero e vedi tutte e cinque le letture, quella senza segno compresa. È la direzione che serve quando un dump non concorda con il numero riportato dal dispositivo.
Ogni valore è gestito con BigInt, quindi 0xFFFFFFFFFFFFFF9C risulta −100 e non un numero qualsiasi prodotto da un troncamento a 32 bit.
Con larghezza 8, −128 non ha forma in modulo e segno né in complemento a uno. La tabella lo scrive invece di stampare un pattern che non significa quel numero.
Inserisci 0 e viene mostrato il secondo pattern di bit dello zero in modulo e segno e in complemento a uno: è l'argomento più chiaro sul perché il complemento a due abbia vinto.
La tabella di confronto a 8 bit e gli intervalli per ciascuna larghezza sono generati in fase di build dallo stesso motore che alimenta i campi interattivi, quindi non possono divergere da esso.
BigInt.asIntN, int.from_bytes(..., signed=True) di Python e i tipi a larghezza fissa del C danno la risposta autorevole per il codice che stai scrivendo. Usali nel codice; usa questa pagina quando hai un valore davanti e nessun interprete aperto.
Mostra il valore con il tipo dichiarato dal programma, che è esattamente l'informazione che manca a un pattern di bit. Non aiuta quando i byte sono arrivati da un collegamento senza tipo dichiarato: è proprio il caso a cui serve questa pagina.
Converte tra basi, ma solo per valori non negativi: lì i negativi sono rifiutati esplicitamente, perché una base non ha alcuna opinione su come si memorizza un segno. La rappresentazione con segno è compito di questa pagina; usa il convertitore di basi per i moduli.
La controparte in virgola mobile. Conserva un layout in modulo e segno anziché il complemento a due e polarizza l'esponente di 2^(e−1)−1, quindi le due pagine rispondono a domande diverse sulla stessa parola di memoria.
-5, larghezza 8
modulo e segno 1000 0101 complemento a uno 1111 1010 complemento a due 1111 1011 (0xFB) binario offset 0111 1011
Le tre codifiche concordano sul bit di segno e divergono su tutto il resto. Solo la riga del complemento a due corrisponde a ciò che un int8_t del C contiene davvero.
0xFB, larghezza 8
senza segno 251 modulo e segno -123 complemento a uno -4 complemento a due -5 binario offset 123
-128, larghezza 8
modulo e segno nessuna rappresentazione complemento a uno nessuna rappresentazione complemento a due 1000 0000 (0x80) binario offset 0000 0000
Modulo e segno e complemento a uno spendono ciascuno un pattern di bit per lo zero negativo, quindi coprono da −127 a 127 e non arrivano a −128. Gli strumenti che qui stampano un byte stanno sbagliando.
0xFFFFFFFFFFFFFF9C, larghezza 64
complemento a due -100 senza segno 18446744073709551516
Tutto ciò che supera i 32 bit va calcolato con BigInt. In JavaScript |, << e >>> troncano silenziosamente a 32 bit, ed è il motivo per cui qui alcuni calcolatori online restituiscono una risposta sbagliata invece di un errore.
4, 8, 16, 32 o 64. Non è una preferenza di visualizzazione: gli stessi bit significano numeri diversi a larghezze diverse, quindi sbagliarla cambia la risposta.
Digita un numero intero, segno negativo incluso. Le quattro codifiche si aggiornano mentre scrivi, insieme alla forma esadecimale di ciascuna.
Incolla una stringa binaria o un valore 0x nel campo di lettura inversa per vedere che cosa significa quel pattern esatto sotto ogni interpretazione, compresa quella senza segno.
La pagina segnala i due casi che fanno inciampare: il valore più negativo che non ha forma in modulo e segno né in complemento a uno, e lo zero che in quelle due codifiche ha un secondo pattern di bit.
Invertire i bit dà il complemento a uno. Fermarsi lì lascia una differenza di 1 rispetto al complemento a due, e l'errore sfugge facilmente perché il risultato sembra comunque un numero negativo plausibile.
5 = 00000101 ~5 = 11111010 <- ones' complement, not -5
5 = 00000101 ~5 = 11111010 ~5 + 1 = 11111011 <- -5 in two's complement
JavaScript tronca a 32 bit gli operandi degli operatori bit a bit. La metà alta sparisce senza errori, quindi il risultato è sbagliato anziché assente.
0xFFFFFFFFFFFFFFFB // 18446744073709552000 -- the literal is already rounded ~0xFFFFFFFFFFFFFFFB + 1 // 0 -- silently wrong, expected -5
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n
Allargare riempiendo di zeri conserva il numero solo quando è positivo. Per un valore negativo il bit di segno va replicato su tutti i bit nuovi.
int8 0xFB (-5) int16 0x00FB (251) <- zero-extended
int8 0xFB (-5) int16 0xFFFB (-5) <- sign-extended
Su otto bit −128 non ha rappresentazione in modulo e segno né in complemento a uno, perché entrambe le codifiche spendono un pattern per lo zero negativo. Stamparvi 10000000 significa confondere la risposta del complemento a due con una codifica che quel numero non sa esprimere.
-128 sign-magnitude: 10000000 <- that pattern means -0
-128 sign-magnitude: no representation at width 8 -128 two's complement: 10000000
0xFF9C. Senza segno vale 65436, che non è una temperatura. Con larghezza 16 la riga del complemento a due mostra −100 e, con un fattore di scala di 0,1 °C, il sensore ti sta dicendo −10,0 °C.n−1 bit sono il modulo, letto come un normale numero senza segno. L'intervallo va da −(2^(n−1)−1) a 2^(n−1)−1, è simmetrico e ha due zeri. È il layout che IEEE 754 usa per la virgola mobile.2^n − 1 − x. Stesso intervallo e stessi due zeri del modulo e segno. L'addizione richiede il riporto circolare, che è esattamente la complicazione eliminata dal complemento a due. In inglese la posizione dell'apostrofo non è un refuso: ones' complement è riferito a una parola di tutti uno, mentre two's complement è riferito a una singola potenza di due.−x è memorizzato come 2^n − x. L'intervallo va da −2^(n−1) a 2^(n−1)−1, è volutamente asimmetrico e ha un solo zero. Addizione, sottrazione e moltiplicazione della parola bassa sono tutte indipendenti dal segno, e questa è l'intera ragione per cui ha vinto.value + 2^(n−1), così −2^(n−1) diventa tutto zeri e i pattern si ordinano nello stesso ordine dei valori che codificano. Equivale al pattern in complemento a due con il bit più alto invertito. Attenzione al nome: i campi esponente di IEEE 754 sono polarizzati di 2^(e−1)−1, uno in meno dell'offset usato qui.&, |, ~ e degli scorrimenti in interi a 32 bit prima di operare e li riconverte dopo, quindi un valore a 64 bit perde la metà alta senza che venga sollevato alcun errore. Ogni conversione di questa pagina è invece eseguita su interi a precisione arbitraria, ed è anche il motivo per cui gli estremi a 64 bit risultano esatti.−(−128) resta −128 per un byte con segno. Qualsiasi codice che calcola un valore assoluto ha bisogno di un piano per questo input, e qualsiasi suite di test dovrebbe contenerlo.0xFB a 8 bit in un campo a 16 bit come 0x00FB trasforma −5 in 251. Allargare un valore con segno significa replicare il bit di segno, ottenendo 0xFFFB.BigInt.asIntN in JavaScript, int.from_bytes(..., signed=True) in Python e i tipi a larghezza fissa in C dicono quello che intendono e gestiscono i casi limite. È il ~x + 1 scritto a mano a generare i bug di larghezza.2^n − x: così sottrazione e addizione usano lo stesso circuito e la retta dei numeri ha esattamente uno zero. 00000101 → 11111010 → 11111011. La sola inversione dà il complemento a uno, ed è per questo che le due forme distano sempre di 1. n bit copre da −2^(n−1) a 2^(n−1)−1, perché non spreca un pattern per lo zero negativo come fanno modulo e segno e complemento a uno. Quella casella in più finisce dal lato negativo. int8_t o uint8_t. value + 2^(n−1), così il valore più piccolo è tutto zeri e ordinare i pattern grezzi come interi senza segno ordina anche i valori con segno. Compare nelle uscite di ADC e DAC e in alcuni formati di campionamento audio. Attenzione: gli esponenti IEEE 754 usano un bias diverso — 2^(e−1)−1, non 2^(e−1) — quindi non riportare il numero da una parte all'altra. 65436, mentre il dispositivo intendeva il valore −100 in complemento a due. Incolla qui 65436 come esadecimale 0xFF9C con larghezza 16 e la riga del complemento a due mostra la lettura voluta. ~x + 1 perde silenziosamente la metà alta di un valore a 64 bit e riporta un risultato plausibile ma sbagliato. Questo strumento usa BigInt ovunque, ed è per questo che le righe a 64 bit qui coincidono con quanto mostra il tuo debugger. 00000000 e 10000000 significano entrambi zero; in complemento a uno sono 00000000 e 11111111. Due confronti che dovrebbero risultare uguali possono quindi risultare diversi bit per bit. Il complemento a due ha un solo zero, e questo ha eliminato un'intera classe di casi speciali nell'hardware. Strumenti di conversione
Converti istantaneamente tra binario, esadecimale, decimale, ottale e qualsiasi base (2-36). Strumento online gratuito e privato: tutta l'elaborazione avviene nel tuo browser.
Strumenti di conversione
Converti i permessi file Linux tra ottale (755, 644) e simboli rwx online: comandi chmod pronti, avvisi sui modi rischiosi come 777, 100% nel browser.
Strumenti di conversione
Converte HEX in RGB, HSL, OKLCH, OKLAB e CMYK direttamente nel browser — basta un clic per copiare qualsiasi formato. Gratuito, senza registrazione, i colori non lasciano mai la pagina.
Strumenti di conversione
Converte colori HEX in CMYK direttamente nel browser. Approssimazione ingenua basata su sRGB per proof di stampa. Gratuito, online, senza registrazione, i colori non lasciano mai la pagina.
Strumenti di conversione
Converte qualsiasi colore hex in HSL direttamente nel browser — supporta hex a 3, 6 e 8 cifre con alpha. Gratuito, istantaneo, online, senza registrazione, i colori non lasciano mai la pagina.
Strumenti di conversione
Converte HEX in OKLCH per i design token di Tailwind v4. Output live percettivamente uniforme con avvisi di gamma Display P3. Gratis, solo browser.