Suponha que os dois operandos sejam tratados como inteiros com sinal em complemento de dois. Mostre quais flags de status são relevantes para determinar o valor relativo dos dois inteiros e que valores dos flags correspondem a maior, igual ou menor.
Passo 1
O enunciado diz que temos dois operandos tratados como inteiros com sinal em complemento de dois e pede: (i) quais flags de status são relevantes para determinar qual operando é maior, igual ou menor; (ii) quais valores desses flags correspondem a “maior”, “igual” ou “menor”.\n
Informações dadas explicitamente:
Informações dadas explicitamente:
Não há outros dados (por exemplo, tamanho em bits), então devemos dar regras gerais que valem para qualquer largura de palavra (8/16/32/64 bits) em aritmética de complemento de dois.
Passo 2
Ideia usada pelo processador: para comparar dois inteiros com sinal
e
costuma-se calcular a diferença
e observar as flags geradas por essa operação. A comparação “é
maior/igual/menor que
?” é traduzida para “o sinal do resultado de
e a flag de zero e a flag de overflow dizem qual é a relação”. Neste problema vamos seguir exatamente esse raciocínio (=subtração) porque é o procedimento padrão em CPUs.
Passo 3
Definição das flags que aparecem e o que significam (explicação didática e sem pular etapas):
- A flag
(Zero): vale se o resultado de for exatamente zero; vale caso contrário. Em comparação, indica igualdade imediata porque .\n - A flag
(Negative ou Sign): é o bit de sinal do resultado de . Em complemento de dois, significa que o resultado é negativo (MSB = 1) e significa resultado não-negativo (MSB = 0).\n - A flag
(Overflow): indica estouro aritmético em interpretação com sinal (overflow em complemento de dois). Formalmente, pode ser obtida como o XOR entre o carry para o penúltimo bit e o carry para o último bit, mas intuitivamente quando o resultado aritmético real (em matemática inteira infinita) não cabe na representação em complemento de dois (por exemplo, soma de dois positivos que deu negativo no resultado armazenado). Em subtração, sinaliza que a interpretação do bit de sinal do resultado pode ter sido corrompida por overflow.\n - A flag
(Carry): indica carry/borrow na aritmética sem sinal; é relevante para comparações sem sinal (unsigned). Para comparações com sinal (do tipo two’s complement) não é usada para decidir maior/menor.
Passo 4
Resumo prático: para comparar inteiros com sinal em complemento de dois usamos
. A
existe, mas é irrelevante para comparação com sinal (ela só importa se você está fazendo comparação sem sinal). Vou explicar por que usamos
e
juntos: o bit de sinal
nos diz se
é negativo ou não, mas se houve overflow o bit
não reflete corretamente a relação matemática entre
e
. A flag
indica esse caso de “enganar o sinal”, por isso a combinação
e
resolve a ambiguidade.
Passo 5
A regra booleana (a que você verá em manuais de assembly e em condicionais de CPU) é:
- Se
então . - Se
então comparar e : - se
(ou seja, ) então ; - se
(ou seja, ) então .\n
Aquié o XOR lógico. Em palavras: quando não há igualdade, se o sinal do resultado é igual ao bit de overflow então o resultado negativo/positivo é confiável — se então ; se então . Quando significa que o overflow inverteu a interpretação do sinal, e a regra corrige isso.
- se
Passo 6
Vou justificar rapidamente com um exemplo numérico (8 bits, para ficar pequeno e palpável) para ver por que o
é necessário:
- Exemplo sem overflow:
. Aqui , e de fato . - Exemplo sem overflow:
. Aqui , e de fato . - Exemplo com overflow (8 bits):
. O resultado armazenado é (bit de sinal ), mas houve overflow porque a verdadeira diferença não cabe em 8 bits com sinal. Temos . Então e a regra diz , que é correto (127 > -128). Sem usar a leitura “resultado negativo” levaria ao erro.
Passo 7
Resumo intuitivo final antes da resposta curta:
-
detecta igualdade direta. -
dá o sinal do resultado de . -
corrige casos de overflow que fariam enganar a gente. -
não é usado para comparação com sinal (two’s complement).
Resposta
Flags relevantes:
Igual:
Maior: e
(equivalente a
e
)
Menor: e
(equivalente a
e
)
Igual:
Maior:
Menor: