Quais são as vantagens do Complemento Two?

11

Em alguns dispositivos ADC / DAC, são opções para saída / entrada de dados no formulário Complemento 2.

Quais são as vantagens de representar dados digitais no formulário Two's Complement Quando você pode simplesmente ter um código binário direto e economizar tempo de conversão?

rahulb
fonte
4
O elogio de Two é um código binário direto ...
Mooing Duck
"A álgebra é executada em uma máquina (o universo) que é um complemento de dois" - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton 13/03/14
2
O que é 5 no complemento de dois? 101. O que é 5 no código binário direto? 101. O que é -5 no complemento de dois? 1 ... 11111011. O que é -5 no código binário direto? Uhh ...
user253751
Parece um caso especial raro ter um ADC com saída negativa? O que isso significa, mesmo que a tensão medida seja menor que a referência de baixa tensão? E como você construiria uma ADC? Aproximação sucessiva com tampas com carga negativa ...?
Lundin 26/09
Observe que existem duas palavras diferentes , complEment e complIment . O assunto aqui é o complemento de dois , mesmo que esses dois sejam muito educados e frequentemente digam coisas boas a seu respeito.
Pete Becker

Respostas:

11

A representação de dois números inteiros assinados é fácil de manipular no hardware. Por exemplo, a negação (ou seja, x = -x ) pode ser realizada simplesmente invertendo todos os bits do número e adicionando um. Realizar a mesma operação no binário bruto (por exemplo, com um bit de sinal) geralmente envolve muito mais trabalho, porque você deve tratar determinados bits no fluxo como especiais. O mesmo vale para adição - a operação de adição para números negativos é idêntica à operação de adição para números positivos, portanto, nenhuma lógica adicional (sem trocadilhos) é necessária para lidar com o caso negativo.

Embora isso não signifique que seja mais fácil da sua perspectiva, como consumidor desses dados, ele diminui o esforço de design e a complexidade do dispositivo, tornando-o mais barato.

Polinomial
fonte
1
Lançando bits e adicionando 1 para negar, não?
Scott Seidman 12/03
2
@ScottSeidman Sim, desculpe, eu esqueci isso. Editado para corrigir :)
Polynomial 12/03
1
Na verdade, para o máximo pickiness, dependendo do processador pode ser um único ciclo de tomar x = x * -1, ou x = 0 - x , contra, pelo menos, dois ciclos para x = ~ x + 1
markt
@markt Sim, mas se você estiver implementando apenas um dispositivo mínimo (ou seja, não um processador completo), faz sentido reduzir a complexidade do silício ao mínimo.
Polinômio 12/03
5
1 Além disso, o complemento de dois tem apenas um único valor para 0. Outros (como um complemento ou bit de sinal) acabam tendo dois
sbell
5

O ADC pode converter dados (digamos, tensões de entrada entre 0 e 5V) e você precisa que esses dados não sejam assinados (0V = 0, 5V = código máximo) ou assinados (2,5V = 0, 0V = max-ve, 5V = max + ve).

Além do complemento de 2 ser a representação computacional mais comum para dados assinados, a conversão entre os dois formatos descritos acima é completamente trivial: basta inverter o MSB!

Isso é incrivelmente barato para adicionar à lógica interna do ADC e dá ao ADC outro ponto de venda na folha de dados ...

Brian Drummond
fonte
Apenas acrescentou o interruptor MSB entre complemento de dois binário e deslocamento como um comentário abaixo
Scott Seidman
3

Se você precisar executar matemática nas representações de números negativos, o complemento de dois torna isso mais fácil do que o binário de deslocamento, que corresponderá ao tipo de dados "assinado int". Seu compilador simplesmente saberá como lidar com isso. Caso contrário, você gasta os tiques do relógio convertendo-se para frente e para trás.

Scott Seidman
fonte
1

Na questão, parece estar implícito que o ADC leva mais tempo para retornar o valor na forma de complemento de 2 do que no binário direto. Embora isso possa ser o caso em alguma implementação específica de um ADC, isso não é verdade em geral (por exemplo, a série MSP430 de microcontroladores possui um on-chip periférico ADC que informa o valor em binário direto ou em complemento de 2, mas leva o mesmo número de ciclos nos dois casos).

Com isso fora do caminho, a escolha entre o complemento de 2 e o binário direto se resume principalmente ao modo como seus transdutores funcionam e como você gosta de processar seus dados.

No modo binário direto, o ADC está fornecendo um número que representa a razão entre a magnitude da quantidade analógica medida (virtualmente sempre tensão) e a quantidade de referência em escala completa. Por exemplo, um ADC de 10 bits pode retornar valores de 0 a 1023 (inclusive). Se você medir uma tensão (por exemplo, 1,25 Volts), que é metade da tensão de referência do ADC (por exemplo, 2,50 Volts), o código binário que você ler será metade do valor máximo que você poderia ler - portanto, 512 ou mais, sujeita a arredondamentos e não linearidades no ADC.

Por exemplo, digamos que você tenha um transdutor que relate a quantidade de combustível de foguete em um tanque. 0V significa que o tanque está vazio e 2,5V Volts significa que está cheio. Então você acabou de conectar o transdutor ao seu ADC e pronto!

Mas observe que no parágrafo acima, não há como medir tensões negativas. E se quiséssemos medir o fluxo de combustível de foguete dentro e fora do tanque (e tivéssemos um transdutor para fazer isso)? O ADC não pode medir números negativos, por isso temos um problema. No entanto, existe uma maneira fácil de falsificá-lo usando o modo de complemento de 2: Nesse caso, a saída do transdutor é polarizada novamente, de modo que o ponto zero esteja a meio caminho entre as duas tensões de referência do ADC. Em outras palavras, os fluxos positivos são representados por tensões entre 1,25V e 2,50V, e os fluxos negativos são representados por 1,25V a 0V - portanto, os fluxos no tanque fornecerão códigos ADC de 512 a 1023 e os fluxos fora do agradecimento fornecerão códigos de 511 a 0 (em formato binário direto).

Agora isso é muito inconveniente. Temos que subtrair 512 de cada medida antes de fazer qualquer coisa com ela, o que fornece números no intervalo -512 a +511. O ponto principal do modo 2 é que ele faz isso por você!

No entanto, você ainda pode querer usar o binário direto com um transdutor que produz resultados assinados. Por exemplo, seu transdutor pode ter saídas diferenciais: nesse caso, você deseja subtrair a saída invertida da saída não invertida de qualquer maneira, portanto, não há vantagem em usar o complemento de 2.

nick g
fonte
1

O sistema de complemento dos dois está em uso, porque decorre de como o hardware simples opera naturalmente. Pense, por exemplo, no odômetro do seu carro, que você redefiniu para zero. Em seguida, coloque a marcha à ré e conduza para trás por 1 milha (por favor, não faça isso na realidade). O seu odômetro (se for mecânico) rolará de 0000 a 9999. O sistema de complemento dos dois se comporta de maneira semelhante.

insira a descrição da imagem aqui


Observe que não estou realmente oferecendo nenhuma informação nova aqui, apenas o exemplo de odômetro que alguém pode achar útil - isso me ajudou a entender a lógica do sistema de complemento de dois quando eu era jovem. Depois disso, foi fácil para mim aceitar intuitivamente que somadores, subtratores etc. funcionam bem com o sistema de complemento dos dois.

E sim, o odômetro do meu Nissan funciona dessa maneira.

PkP
fonte
A sua resposta é de cerca de estouro (e underflow), mas desde que o hodômetro não exibir números negativos, ele não aborda qualquer coisa dois do relacionadas com o complemento ...
marcelm
@marcelm, na verdade, o exemplo hodômetro faz explicar complemento de dois. Só que o PkP não foi suficientemente longe com a explicação. Se um odômetro de seis dígitos lê zero, e você dirige em marcha à ré por uma milha, esperaria que ele lesse -1. Em vez disso, lê 999999. Isso porque 999999 é a dezena de seis dígitos que complementa a representação de -1.
Solomon Slow
@jameslarge Não, ainda não funciona. Não há nada na resposta que realmente toque o complemento de dois. Ou o complemento, a magnitude dos sinais ou qualquer representação numérica assinada.
marcelm
@ marcelm Sim, existe: a idéia central do sistema de complemento dos dois: que zero menos um é igual ao número máximo não assinado representável máximo. Essa é a idéia do sistema de complemento de dois. Nenhuma outra representação numérica assinada oferece isso (que eu saiba). E o exemplo do odômetro mostra como essa propriedade comportamental vem naturalmente da simplicidade da engenharia; no caso do odômetro: da engenharia mecânica. No mundo mecânico e eletrônico, ele (o sistema de complemento dos dois) é a maneira mais simples de fazê-lo funcionar.
PkP 01/10/19
0

Outros já responderam por que dois elogios ao binário são convenientes para o hardware do computador. No entanto, você parece estar se perguntando por que um A / D produziria dois elogios em vez de "binário direto" (o que você acha que isso realmente significa).

A maioria dos A / Ds produz um valor binário simples não assinado, variando de 0 a 2 N -1, onde N é o número de bits em que o A / D converte. Observe que isso também pode ser considerado como uma notação de dois complementos, apenas que os valores nunca são negativos. Se você está lidando apenas com números positivos, a maioria das representações binárias é a mesma. Isso inclui dois elogios e magnitude de sinal.

Alguns A / Ds, particularmente aqueles integrados em microcontroladores, têm a opção de produzir valores negativos para a metade inferior de sua faixa. Isso pode ser uma vantagem percebida ao medir um sinal bipolar.

Pelo menos em um microcontrolador, isso geralmente é bobagem. Em alguns casos, você pode usar os valores A / D diretamente sem nenhuma conversão. Nesse caso, você já converteu todos os outros valores para o intervalo A / D. Restringir isso a todos os números não negativos simplifica as coisas.

Caso contrário, você aplicará alguma escala e deslocamento às leituras A / D de qualquer maneira para colocá-las em quaisquer unidades usadas para valores internamente. Aqui, novamente, não há desvantagem para valores não assinados que saem diretamente do A / D. De fato, eu geralmente aplico alguma filtragem passa-baixa nos valores brutos antes de qualquer escala e deslocamento. Saber que esses valores nunca serão negativos simplifica um pouco os cálculos. Fazer o dimensionamento de valores não assinados também torna as coisas um pouco mais simples às vezes.

Não me lembro de um único caso em mais de 100 projetos de microcontroladores em que usei o A / D em qualquer formato de saída não assinado.

Portanto, para responder à pergunta sobre quais são as vantagens de um A / D com "dois elogios", há duas respostas:

  1. Todos eles funcionam de qualquer maneira, apenas que na maioria das vezes esses valores não são negativos, então você não pode dizer a diferença entre dois elogios e outras notações, como magnitude de sinal.

  2. As vantagens são muito pequenas. Dentro de um microcontrolador, eles são essencialmente inexistentes.

    No hardware dedicado, pode haver alguma vantagem em ter valores negativos indicando tensão de entrada negativa; nesse caso, dois elogios são a maneira mais fácil de lidar com a faixa de valores. Observe que, se a faixa de tensão de entrada não for simétrica em torno de 0, essa vantagem desaparece.

Olin Lathrop
fonte
-1

O que é esse 'código binário direto' de que você fala? Suponho que você queira ter um bit de sinal que seja '1' para negativo e '0' para positivo (ou vice-versa ). Isso tem mais duas desvantagens em relação aos dois complementos que ainda não foram mencionados: um amplamente irrelevante atualmente e outro importante.

O mais irrelevante é que você pode representar um número a menos - ou seja, 255 números em 8 bits. Isso é irrelevante quando você tem 32 ou 64 bits, mas importava quando você tinha apenas 4 ou 6 bits para trabalhar.

O mais importante é que agora existem duas maneiras de representar o mesmo número - especificamente, 0 - +0 e -0, mas +0 e -0 são o mesmo número; portanto, sua implementação precisa garantir que você não esteja comparando esses números. números toda vez que você faz uma verificação de igualdade.

Jack Aidley
fonte
Eu acho que você está fora dos trilhos aqui. Você está falando de uma representação de magnitude de sinal quando o OP estava falando claramente sobre uma representação binária não assinada.
21814 Joe Hass
1
Se você está falando de uma representação não assinada, não há vantagem no complemento do Two. Simplesmente desperdiça um pouco.
Jack Aidley