Skip to content

Calcolatore di Complemento a Due e Interi con Segno

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.

Niente tracciamento Funziona nel browser Gratuito
Tutto viene calcolato localmente nel tuo browser: nulla di ciò che digiti viene caricato.
Larghezza in bit

Da decimale a rappresentazione macchina

Digita un numero intero con segno. Le quattro rappresentazioni vengono calcolate insieme: non devi sapere in anticipo quale usa il tuo sistema.

Prova questi
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

Da pattern di bit a valore

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
Tabella di riferimento a 8 bit

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
Intervalli di valori per larghezza in bit
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
Ogni codifica è verificata con asserzioni nella suite di test su tutte e cinque le larghezze, compreso l'intero intervallo a 4 bit, entrambi i pattern dello zero e il valore più negativo di ciascuna larghezza. I risultati a 64 bit sono riscontrati con BigInt.asIntN e BigInt.asUintN di JavaScript. — Team Go Tools · Sep 9, 2026

Realizzato e verificato dal team di ingegneria di Go Tools.

Risposte rapide

Quanto vale −5 in complemento a due a 8 bit?

11111011 11111011, cioè 0xFB.

Qual è l'intervallo di un byte con segno?

-128 … 127 Da −128 a 127 in complemento a due; da −127 a 127 in modulo e segno e in complemento a uno.

Come si torna da un pattern in complemento a due a un numero?

valore − 2^n Se il bit più alto è 0 leggilo come senza segno; se è 1, sottrai 2^n dalla lettura senza segno.

0xFF significa −1 o 255?

−1 o 255 −1 come byte con segno, 255 come byte senza segno. I bit da soli non lo decidono.

Che cos'è il complemento a due?

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.

Che cosa fa questo calcolatore

Quattro codifiche in una volta

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.

Lettura inversa da un pattern di bit

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.

Corretto a 64 bit

Ogni valore è gestito con BigInt, quindi 0xFFFFFFFFFFFFFF9C risulta −100 e non un numero qualsiasi prodotto da un troncamento a 32 bit.

Dice chiaramente quando non esiste rappresentazione

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.

Zero negativo reso visibile

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.

Tabelle di riferimento senza JavaScript

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.

Come si confronta con altri modi di verificare

La conversione nativa del tuo linguaggio

API di runtime

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.

La vista di memoria di un debugger

Funzione dell'IDE

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.

Convertitore di basi

Su questo sito

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.

Convertitore IEEE 754

Su questo sito

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.

Esempi svolti

−5 in un byte da 8 bit

-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.

Il byte 0xFB letto in cinque modi

0xFB, larghezza 8
senza segno        251
modulo e segno     -123
complemento a uno  -4
complemento a due  -5
binario offset     123

−128 non ha forma in modulo e segno

-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.

Un valore di registro a 64 bit

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.

Come si usa il calcolatore di complementi

  1. 1

    Scegli la larghezza in bit

    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.

  2. 2

    Inserisci un decimale con segno

    Digita un numero intero, segno negativo incluso. Le quattro codifiche si aggiornano mentre scrivi, insieme alla forma esadecimale di ciascuna.

  3. 3

    Oppure parti dai bit

    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.

  4. 4

    Leggi le note quando compaiono

    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.

Errori che producono risposte sbagliate

Dimenticare il +1

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.

✗ Errato
5   = 00000101
~5  = 11111010   <- ones' complement, not -5
✓ Corretto
5        = 00000101
~5       = 11111010
~5 + 1   = 11111011   <- -5 in two's complement

Usare operatori bit a bit a 32 bit su un valore a 64 bit

JavaScript tronca a 32 bit gli operandi degli operatori bit a bit. La metà alta sparisce senza errori, quindi il risultato è sbagliato anziché assente.

✗ Errato
0xFFFFFFFFFFFFFFFB        // 18446744073709552000  -- the literal is already rounded
~0xFFFFFFFFFFFFFFFB + 1   // 0  -- silently wrong, expected -5
✓ Corretto
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn)   // -5n

Estendere con zeri un valore negativo

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.

✗ Errato
int8  0xFB  (-5)
int16 0x00FB  (251)   <- zero-extended
✓ Corretto
int8  0xFB  (-5)
int16 0xFFFB  (-5)    <- sign-extended

Attribuire una forma in modulo e segno al valore più negativo

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.

✗ Errato
-128 sign-magnitude: 10000000   <- that pattern means -0
✓ Corretto
-128 sign-magnitude: no representation at width 8
-128 two's complement: 10000000

Quando serve davvero

Leggere il registro di un sensore
Un registro di temperatura restituisce 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.
Diagnosticare un protocollo con campi senza tipo
Modbus, CAN e gran parte della telemetria binaria trasportano parole grezze senza alcuna indicazione di segno. Quando un client e un dispositivo non concordano su un valore, confrontare entrambe le letture della stessa parola di solito individua quale dei due ha fatto l'assunzione sbagliata.
Esercizi di architettura degli elaboratori
Modulo e segno, complemento a uno, complemento a due e binario con offset sono le quattro codifiche standard di un corso introduttivo. Averle affiancate alla stessa larghezza rende le differenze visibili invece che da memorizzare.
Inseguire un overflow di interi
Quando un contatore salta da 2147483647 a −2147483648, vedere entrambi come pattern a 32 bit mostra che il riporto è finito nel bit di segno. Il valore non è diventato incomprensibile: è avvolto esattamente come la codifica prevede.
Scrivere codice di serializzazione
Prima di fidarti di un encoder scritto a mano, verifica su questa pagina un valore negativo per ciascuna larghezza. Un errore di segno è facilissimo da scrivere e produce un output strutturalmente sensato fino all'arrivo del primo numero negativo vero.

Come sono costruite le quattro codifiche

Modulo e segno
Il bit più alto è il segno e i restanti 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.
Complemento a uno
Un valore negativo è l'inverso bit a bit del suo modulo, cioè 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.
Complemento a due
Un valore negativo −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.
Binario con offset
Memorizza 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.
Perché l'aritmetica usa BigInt
JavaScript converte gli operandi di &, |, ~ 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.

Gestire correttamente i valori con segno

Fissa la larghezza prima di ogni altra cosa
Un pattern di bit non ha valore finché non dici quanto è largo il campo. La maggior parte dei disaccordi tra un datasheet e un debugger si riduce a una parte che assume 16 bit e l'altra 32.
Tratta il valore più negativo come un caso speciale
Negarlo va in overflow a qualsiasi larghezza: in complemento a due −(−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.
Non dedurre mai la presenza del segno dai dati
Nessuna ispezione dei bit può dirti se un campo è con segno. Ricavalo dal datasheet, dallo schema o dalla definizione della struct; tirare a indovinare funziona fino al primo valore negativo in produzione.
Estendi il segno quando allarghi
Copiare un 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.
Preferisci la conversione nativa del linguaggio
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.

Domande frequenti

Che cos'è il complemento a due, in una frase?
È la convenzione per cui un numero negativo −x viene memorizzato con il pattern di bit di 2^n − x: così sottrazione e addizione usano lo stesso circuito e la retta dei numeri ha esattamente uno zero.
Come si calcola a mano un complemento a due?
Scrivi il modulo in binario, inverti tutti i bit e aggiungi 1. Per 5 su otto bit: 000001011111101011111011. La sola inversione dà il complemento a uno, ed è per questo che le due forme distano sempre di 1.
Perché in un byte con segno ci sta −128 ma non +128?
Il complemento a due è volutamente asimmetrico. Con 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.
11111011 vale −5 o 251?
Entrambi, e i bit da soli non possono dirtelo: la risposta dipende dal tipo dichiarato dal sistema che li ha prodotti. Per questo la lettura inversa di questa pagina mostra tutte le interpretazioni insieme invece di sceglierne una al posto tuo — prendi la riga che corrisponde al tuo int8_t o uint8_t.
Che cos'è il binario con offset e dove lo si incontra?
Il binario con offset (detto anche eccesso-K o rappresentazione polarizzata) memorizza 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.
Perché un registro Modbus legge 65436 mentre il sensore dice −100?
Modbus trasporta parole da 16 bit senza alcuna informazione di tipo: un client che assume valori senza segno stampa 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.
Modulo e segno e complemento a uno si usano ancora?
Per gli interi quasi mai: praticamente ogni CPU attuale usa il complemento a due, e il C23 lo ha finalmente reso obbligatorio. Restano rilevanti perché la virgola mobile IEEE 754 conserva un layout in modulo e segno, e perché continuano a comparire nelle domande d'esame di architettura degli elaboratori.
Perché alcuni calcolatori sbagliano sui valori a 64 bit?
Gli operatori bit a bit di JavaScript convertono prima gli operandi in interi a 32 bit, quindi una pagina che usa ~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.
Che cos'è lo zero negativo e perché conta?
In modulo e segno 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.
Quello che digito viene inviato a un server?
No. La pagina consegna il motore di conversione al tuo browser e lo esegue lì. I dump di registri e i valori di firmware arrivano spesso da sistemi che non sei libero di condividere, quindi qui non devi fidarti di nessuna promessa: apri il pannello di rete e vedrai che non parte alcuna richiesta.

Strumenti correlati

Vedi tutti gli strumenti →