Melhor resposta
No início, precisamos enfatizar esses pontos:
-
ALU
não se importa se você está fazendo matemática com ou sem sinal. -
ALU
apenas faz o binário matemática e define os sinalizadores de forma adequada. - Em
signed numbers
o bit de sinal é um bit que indica o sinal do número. e está localizado no bit mais significativo.
– Em unsigned aritmética, precisamos observar o sinalizador de transporte para detectar erros.
– Em assinado aritmética, precisamos observar o sinalizador de estouro para detectar erros.
– O Sinalizador de transporte está definido se:
- a adição de dois números causa a execução dos bits mais significativos (mais à esquerda) e d.
-
1111 + 0001 = 0000
=> o sinalizador de transporte está ativado. - a subtração de dois números requer um empréstimo no mais significativo (mais à esquerda ) bits subtraídos.
-
0000 - 0001 = 1111
=> o sinalizador de transporte está ativado.
– o Sinalizador de estouro é definido se:
- a soma de dois números com o bit de sinal
off
produzir um resultado número com o bit de sinalon
. -
0100 + 0100 = 1000
=> sinalizador de estouro está ativado. - a soma de dois números com o bit de sinal
on
produz um número de resultado com o bit de sinaloff
. -
1000 + 1000 = 0000
=> sinalizador de estouro está ativado. - Observe que : Sinal misto adição nunca ativa o sinalizador de estouro.
– para deixar mais claro, vejamos esses 2 exemplos:
1- suponha a seguinte adição binária `0111 + 0010 = 1001 `
– se estivermos fazendo matemática sem sinais
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = 9 // its ok, we only care about the carry flag
– se estivermos fazendo matemática com sinais
0111 + 0010 = 1001 // overflow flag is turned on.
7 + 2 = -7 // error detected
2- assuma a seguinte adição binária `1111 + 0001 = 0000`
– se estivermos fazendo matemática sem sinais
1111 + 0001 = 0000 // carry flag is turned on.
15 + 1 = 0 // error detected
– se estivermos fazendo matemática com sinais
1111 + 0001 = 0000 // carry flag is turned on.
-1 + 1 = 0 // its ok we only care about the overflow flag
// remember: Mixed-sign addition never turns on the overflow flag.
finalmente, você pode encontrar mais informações aqui: http://teaching.idallen.com/dat2343/10f/notes/040\_overflow.txt
Resposta
De um ponto de vista mecanicista, o sinalizador de carry é definido quando há um carry out do bit mais significativo. O sinalizador de estouro é definido quando há um carry para o bit mais significativo.
Com aritmética sem sinal, você só precisa se preocupar com o transporte bandeira. Se algo é realizado a partir do bit mais significativo, o resultado é muito grande para ser contido em um único registro.
Para aritmética com sinais, a situação é mais complexa. O estouro ocorre quando o sinalizador de transporte e o sinalizador de estouro são diferentes. Aqui estão todas as alternativas para adição em dois bits.
00 + 00 = 00, (0 + 0 = 0 decimal), CF = 0, OF = 0
01 + 01 = 10, (1 + 1 = -2 decimal) CF = 0, OF = 1 overflow
01 + 10 = 11, ( 1 + -2 = -1 decimal), CF = 0, OF = 0
01 + 11 = 00, ( 1 + -1 = 0 decimal), CF = 1, OF = 1
10 + 10 = 00, ( -2 + -2 = 0 decimal), CF = 1, OF = 0 overflow
10 + 11 = 01, ( -2 + -1 = 1 decimal), CF = 1, OF = 0 overflow
11 + 11 = 10, (-1 + -1 = -2 decimal), CF = 1, OF = 1
Observe que as linhas 2, 5 e 6 produzem resultados incorretos devido ao estouro e que também ocorre quando CF é diferente de OF.
Alguns processadores podem fazer essa comparação para você e o OF que você vê pode ser o resultado da comparação de um sinalizador de transporte interno com o sinalizador de transporte (saída). Ainda será válido apenas para aritmética com sinais.
Também funciona com outras aritméticas, incluindo multiplicação.