Altifigence Academy

8 / 37 · Conceito

Complemento de dois, extensão de sinal e overflow

Distinga a interpretação signed e as condições de overflow com equações e contraexemplos.

O peso do bit mais significativo muda

Um inteiro de NN bits em complemento de doisComplemento de dois Representação de inteiros com sinal por sequências de bits de largura fixa. O intervalo de n bits vai de −2^(n−1) a 2^(n−1)−1. é interpretado assim:

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

1010 de quatro bits é 10 em unsignedunsigned Interpretação de uma sequência de bits como inteiro não negativo. Com n bits, o intervalo é de 0 a 2^n−1; pode diferir da interpretação signed dos mesmos bits. Saiba mais e -6 em signed. Não se separa um bit de sinal para ler o restante como magnitude. Em largura fixa, −x-x é obtido invertendoNegação Operação NOT que troca 0 por 1 e 1 por 0. Uma barra sobre uma expressão aplica NOT a toda a expressão coberta. Saiba mais os bits e somando 1, mas o oposto +8 do mínimo -8 não cabe em signed de quatro bits.

Estender deve preservar o valor

A extensão unsigned acrescenta zeros à esquerda; a signed repete o sinal. Estender 1010 para 00001010 dá +10; para 11111010, dá -6. A interpretação define o circuito de extensão necessário.

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]);

O exemplo soma dois operandos signed sem carry de entrada. Preserva em exact a soma de cinco bits e confere o sinal do resultado reduzido.

O valor inicial é 11111010. Observe que unsigned 250 e signed −6 compartilham os mesmos bits. Ao mudar b7, as interpretações variam em sentidos opostos.

Como interpretar o sinal dos mesmos oito bits

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

Carry e overflow signed são diferentes

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})

Há overflow se valores do mesmo sinal forem somados e o sinal do resultado mudar. Em quatro bits, 7+37+3 é armazenado como 1010, que parece -6; −8+(−1)-8+(-1) fica como 0111, que parece +7. Somar dois valores de sinais opostos não produz esse excesso de intervalo.

Misturar signed e unsigned dificulta o raciocínio sobre comparação e extensão. Especifique largura e sinal de ambos os operandos e inclua mínimo, -1, 0 e máximo nos testes de fronteira.

Experimente

Em signed de 4 bits, calcule os bits armazenados e o overflow de −3+(−4)-3+(-4) e 5+55+5. Explique também o que ocorre ao negar −8-8.

Ler a explicação

−7-7 é 1001, sem overflow. 10 está fora do intervalo e é armazenado como 1010 (-6), com overflow. Inverter -8 e somar 1 deixa novamente 1000, pois +8 não pode ser representado. Esse resultado não deve ser usado como valor absoluto correto.

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.