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:
\text{os operandos são inteiros com sinal em complemento de dois}ã
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 A e B costuma-se calcular a diferença
A - B
e observar as flags geradas por essa operação. A comparação “é A maior/igual/menor que B?” é traduzida para “o sinal do resultado de A-B 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):
Z,\\ N,\\ V,\\ C
  • A flag Z (Zero): vale 1 se o resultado de A-B for exatamente zero; vale 0 caso contrário. Em comparação, Z=1 indica igualdade imediata porque A-B=0\Rightarrow A=B.\n
  • A flag N (Negative ou Sign): é o bit de sinal do resultado de A-B. Em complemento de dois, N=1 significa que o resultado é negativo (MSB = 1) e N=0 significa resultado não-negativo (MSB = 0).\n
  • A flag V (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 V=1 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, V sinaliza que a interpretação do bit de sinal do resultado pode ter sido corrompida por overflow.\n
  • A flag C (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) C não é usada para decidir maior/menor.

Passo 4

Resumo prático: para comparar inteiros com sinal em complemento de dois usamos \;Z,\\ N,\\ V\;. A C existe, mas é irrelevante para comparação com sinal (ela só importa se você está fazendo comparação sem sinal). Vou explicar por que usamos N e V juntos: o bit de sinal N nos diz se A-B é negativo ou não, mas se houve overflow o bit N não reflete corretamente a relação matemática entre A e B. A flag V indica esse caso de “enganar o sinal”, por isso a combinação N e V resolve a ambiguidade.

Passo 5

A regra booleana (a que você verá em manuais de assembly e em condicionais de CPU) é:
  • Se \;Z=1\; então A=B.
  • Se \;Z=0\; então comparar N e V:
    • se \;N \oplus V = 0\; (ou seja, N=V) então A>B;
    • se \;N \oplus V = 1\; (ou seja, N\neq V) então A<B.\n
      Aqui \oplus é 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 N=0 então A-B>0\Rightarrow A>B; se N=1 então A-B<0\Rightarrow A<B. Quando N\neq V significa que o overflow inverteu a interpretação do sinal, e a regra N\oplus V corrige isso.

Passo 6

Vou justificar rapidamente com um exemplo numérico (8 bits, para ficar pequeno e palpável) para ver por que o N\oplus V é necessário:
  • Exemplo sem overflow: A=5,\\ B=3. A-B = 2 \quad\Rightarrow\quad Z=0,\\ N=0,\\ V=0.Aqui N\oplus V=0, e de fato A>B.
  • Exemplo sem overflow: A=3,\\ B=5. A-B = -2 \quad\Rightarrow\quad Z=0,\\ N=1,\\ V=0.Aqui N\oplus V=1, e de fato A<B.
  • Exemplo com overflow (8 bits): A=127,\\ B=-128. A-B = 127 - (-128) = 255 \equiv -1\\ (\text{em 8 bits}).O resultado armazenado é -1 (bit de sinal N=1), mas houve overflow V=1 porque a verdadeira diferença 255 não cabe em 8 bits com sinal. Temos Z=0,\\ N=1,\\ V=1. Então N\oplus V=0 e a regra diz A>B, que é correto (127 > -128). Sem usar V a leitura “resultado negativo” levaria ao erro.

Passo 7

Resumo intuitivo final antes da resposta curta:
  • Z detecta igualdade direta.
  • N dá o sinal do resultado de A-B.
  • V corrige casos de overflow que fariam N enganar a gente.
  • C não é usado para comparação com sinal (two’s complement).

Resposta

Flags relevantes: Z,\\ N,\\ V
Igual: Z=1
Maior: Z=0 e N \oplus V = 0 (equivalente a Z=0 e N=V)
Menor: Z=0 e N \oplus V = 1 (equivalente a Z=0 e N\neq V)

Exercícios relacionados