Altifigence Academy

8 / 37 · Concetto

Complemento a due, estensione del segno e overflow

Distinguere interpretazione signed e overflow dell’addizione con formule e controesempi.

Cambia il peso del bit più significativo

Un intero in complemento a dueComplemento a due Rappresentazione di interi con segno a larghezza fissa. Con n bit il campo è da −2^(n−1) a 2^(n−1)−1. a NN bit si interpreta così:

s=−bN−12N−1+∑i=0N−2bi2is=-b_{N-1}2^{N-1}+\sum_{i=0}^{N-2}b_i2^i
−2N−1≤s≤2N−1−1-2^{N-1}\le s\le 2^{N-1}-1

I quattro bit 1010 valgono 10 unsignedUnsigned Interpretazione dei bit come intero non negativo. Il campo a n bit è 0–2^n−1 e può differire dalla lettura signed degli stessi bit. Approfondisci e −6 signed. Non si legge il bit di segno separatamente trattando gli altri come valore assoluto. A larghezza fissa, −x-x si ottiene invertendoInversione NOT scambia 0 e 1. Una barra superiore applica NOT all’intera espressione sottostante. Approfondisci i bit e aggiungendo 1; tuttavia il positivo +8 del minimo −8 non esiste nello stesso intervallo signed a quattro bit.

L'estensione deve conservare il valore

L'estensione unsigned aggiunge zeri a sinistra, quella signed replica il bit di segno. Da 1010, 00001010 rappresenta +10 e 11111010 rappresenta −6. Estendere gli stessi bit richiede circuiti diversi secondo l'interpretazione.

SystemVerilog
logic signed [3:0] a, b;
logic signed [4:0] exact;
logic [3:0] result;
logic overflow;
assign exact = {a[3], a} + {b[3], b};
assign result = exact[3:0];
assign overflow = (a[3] == b[3]) && (result[3] != a[3]);

L'esempio somma due operandi signed senza carry in ingresso. Conserva la somma a cinque bit in exact e controlla il segno del risultato ridotto.

Il valore iniziale è 11111010: unsigned 250 e signed −6 condividono gli stessi bit. Cambiando b7, le due interpretazioni variano in direzioni opposte.

Interpretare il segno degli stessi otto bit

11111010 → unsigned 250 · signed -6 · hex 0xFA

Carry e overflow signed sono diversi

V=aN−1⊕bN−1‾ (sN−1⊕aN−1)V=\overline{a_{N-1}\oplus b_{N-1}}\,(s_{N-1}\oplus a_{N-1})

Se operandi dello stesso segno producono un risultato di segno opposto, c'è overflow. A quattro bit, 7+37+3 si memorizza come 1010, apparentemente −6, e −8+(−1)-8+(-1) come 0111, apparentemente +7. Due numeri di segno diverso non producono questo superamento di campo.

Mescolare signed e unsigned in RTL rende insidiose le regole di confronto ed estensione. Esplicitate larghezza e segno dei due operandi e includete minimo, −1, 0 e massimo nei test di confine.

Prova tu

Calcolate bit memorizzati e overflow per −3+(−4)-3+(-4) e 5+55+5 a quattro bit signed. Spiegate anche la negazione di −8-8.

Leggi la spiegazione

−7-7 è 1001 senza overflow. 10 è fuori intervallo e si memorizza come 1010 (−6): overflow. Invertendo −8 e aggiungendo 1 resta 1000, perché +8 non è rappresentabile. Non è un calcolo valido del valore assoluto.

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.