O que é o "Complemento 2"?

434

Estou em um curso de sistemas de computador e tenho lutado , em parte, com o complemento de dois . Quero entender, mas tudo o que li não trouxe a imagem para mim. Eu li o artigo da Wikipedia e vários outros artigos, incluindo o meu livro de texto .

Portanto, eu queria começar este post no wiki da comunidade para definir o que é o Complemento do Dois, como usá-lo e como ele pode afetar números durante operações como elencos (de assinado a não assinado e vice-versa), operações por bits e operações por troca de bits .

O que espero é uma definição clara e concisa que seja facilmente entendida por um programador.

Frank V
fonte

Respostas:

627

O complemento de Two é uma maneira inteligente de armazenar números inteiros, para que problemas matemáticos comuns sejam muito simples de implementar.

Para entender, você precisa pensar nos números em binário.

Diz basicamente

  • para zero, use todos os 0s.
  • para números inteiros positivos, comece a contar, com um máximo de 2 (número de bits - 1) -1.
  • para números inteiros negativos, faça exatamente a mesma coisa, mas mude a função de 0 e 1 (portanto, em vez de começar com 0000, comece com 1111 - essa é a parte do "complemento").

Vamos tentar com um mini-byte de 4 bits (vamos chamá-lo de uma mordidela - 1/2 a byte).

  • 0000 - zero
  • 0001 - 1
  • 0010 - dois
  • 0011 - três
  • 0100para 0111- quatro para sete

Isso é o mais longe que podemos chegar em aspectos positivos. 2 3 -1 = 7.

Para negativos:

  • 1111 - negativo
  • 1110 - dois negativos
  • 1101 - três negativos
  • 1100para 1000- quatro negativo para oito negativo

Observe que você obtém um valor extra para negativos ( 1000= -8) e não para positivos. Isso ocorre porque 0000é usado para zero. Isso pode ser considerado como número de linha de computadores.

Distinguir entre números positivos e negativos

Fazendo isso, o primeiro bit obtém o papel do bit "sign", pois pode ser usado para distinguir entre valores decimais não negativos e negativos. Se o bit mais significativo for 1, pode-se dizer que o binário é negativo, onde, como se o bit mais significativo (o mais à esquerda) fosse 0, você pode dizer que o valor decimal não é negativo.

Os números negativos do "complemento de alguém" apenas mudam o bit do sinal e depois contam com 0. Mas essa abordagem tem que lidar com a interpretação 1000como "zero negativo", o que é confuso. Geralmente, você só precisa se preocupar com isso ao trabalhar perto do hardware.

lavinio
fonte
147
Provavelmente, a melhor parte do complemento de dois é como simplifica a matemática. Tente adicionar 2 (0010) e -2 (1110) juntos e você começa 10000. O bit mais significativo é excesso, de modo que o resultado é realmente 0000. Quase como mágica, 2 + -2 = 0.
Naaff
96
Outra vantagem, além da fácil adição e subtração, é que o complemento 2s tem apenas um zero. Se você estivesse usando um bit de sinal simples, digamos, usando 0001 para representar +1 e 1001 para representar -1, teria dois zeros: 0000 ("+0") e 1000 ("-0"). Isso é uma verdadeira dor nas costas.
Jörg W Mittag
26
Voto positivo por ser direto ao ponto e também por explicar por que os valores negativos têm uma faixa maior dos positivos. Eu vim procurando o motivo da diferença de alcance.
Ashwin
2
Você não deveria dizer "para números inteiros negativos, faça exatamente a mesma coisa, mas faça uma contagem regressiva e mude o papel dos
zeros e zeros
1
Impressionante. Adicionadas partes extras da conversão de bits em número inteiro negativo.
precisa saber é o seguinte
339

Gostaria de saber se poderia ser explicado melhor do que o artigo da Wikipedia.

O problema básico que você está tentando resolver com a representação de complemento de dois é o problema de armazenar números inteiros negativos.

Primeiro, considere um número inteiro não assinado armazenado em 4 bits. Você pode ter o seguinte

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Eles não são assinados porque não há indicação se são negativos ou positivos.

Magnitude do sinal e excesso de notação

Para armazenar números negativos, você pode tentar várias coisas. Primeiro, você pode usar a notação de magnitude de sinal que atribui o primeiro bit como um sinal para representar +/- e os bits restantes para representar a magnitude. Então, usando 4 bits novamente e assumindo que 1 significa - e 0 significa +, então você tem

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Então, você vê o problema aí? Temos 0. positivo e negativo. O maior problema é adicionar e subtrair números binários. Os circuitos para adicionar e subtrair usando a magnitude do sinal serão muito complexos.

O que é

0010
1001 +
----

?

Outro sistema é a notação em excesso . Você pode armazenar números negativos, se livrar do problema dos dois zeros, mas a adição e a subtração continuam difíceis.

Então vem o complemento de dois. Agora você pode armazenar números inteiros positivos e negativos e executar aritmética com relativa facilidade. Existem vários métodos para converter um número no complemento de dois. Aqui está um.

Converter decimal em complemento de dois

  1. Converta o número em binário (ignore o sinal por enquanto), por exemplo, 5 é 0101 e -5 é 0101

  2. Se o número for positivo, estará pronto. por exemplo, 5 é 0101 em binário usando a notação de complemento de dois.

  3. Se o número for negativo, então

    3.1 encontre o complemento (inverta 0 e 1), por exemplo, -5 é 0101, portanto, encontrar o complemento é 1010

    3.2 Adicione 1 ao complemento 1010 + 1 = 1011. Portanto, -5 no complemento de dois é 1011.

Então, e se você quisesse fazer 2 + (-3) em binário? 2 + (-3) é -1. O que você faria se estivesse usando a magnitude dos sinais para adicionar esses números? 0010 + 1101 =?

Usando o complemento de dois, considere como seria fácil.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Convertendo o complemento de dois em decimal

Convertendo 1111 para decimal:

  1. O número começa com 1, então é negativo, então encontramos o complemento de 1111, que é 0000.

  2. Adicione 1 a 0000 e obteremos 0001.

  3. Converta 0001 em decimal, que é 1.

  4. Aplique o sinal = -1.

Tada!

Vincent Ramdhanie
fonte
45
Melhor resposta na minha opinião.
Koray Tugay
5
sim, este é bem simples e explica o assunto muito bem
Max Koretskyi
3
Não entendo como adicionar um ao converter os dois lados sempre leva ao mesmo número. Na minha opinião, você reverteria as etapas ou subtrairia uma ou outra coisa.
Marcos Pereira
2
Por que adicionar 1 ao complemento?
Zinan Xing
4
Esta resposta deve ser usada na Wikipedia.
Hiroki
119

Como a maioria das explicações que já vi, as acima são claras sobre como trabalhar com o complemento de 2, mas não explicam realmente o que são matematicamente. Vou tentar fazer isso, pelo menos para números inteiros, e abordarei alguns antecedentes que provavelmente são familiares primeiro.

Lembre-se de como funciona o decimal:
  2345
é uma maneira de escrever
  2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .

Da mesma forma, binário é uma maneira de escrever números usando apenas 0 e 1 seguindo a mesma idéia geral, mas substituindo os 10s acima por 2s. Então, em binário,
  1111
é uma maneira de escrever
  1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
e, se você resolver isso, será igual a 15 (base 10). Isso é porque é
  8 + 4 + 2 + 1 = 15.

Tudo está bem para números positivos. Até funciona para números negativos, se você quiser colocar um sinal de menos na frente deles, como os humanos fazem com números decimais. Isso pode até ser feito em computadores, mais ou menos, mas eu não o vejo desde o início dos anos 70. Vou deixar as razões para uma discussão diferente.

Para computadores, é mais eficiente usar um representação de complemento para números negativos. E aqui está algo que geralmente é esquecido. As notações de complemento envolvem algum tipo de reversão dos dígitos do número, mesmo os zeros implícitos anteriores a um número positivo normal. Isso é estranho, porque surge a pergunta: todos eles? Esse pode ser um número infinito de dígitos a serem considerados.

Felizmente, os computadores não representam infinitos. Os números são restritos a um comprimento específico (ou largura, se você preferir). Então, vamos voltar aos números binários positivos, mas com um tamanho específico. Vou usar 8 dígitos ("bits") para esses exemplos. Portanto, nosso número binário seria realmente
  00001111
ou
  0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0

Para formar o complemento 2 negativo, primeiro complementamos todos os dígitos (binários) para formar
  11110000
e adicionamos 1 ao formulário
   11110001,
mas como devemos entender isso como -15?

A resposta é que mudamos o significado do bit de ordem superior (o mais à esquerda). Este bit será 1 para todos os números negativos. A mudança será alterar o sinal de sua contribuição para o valor do número em que aparece. Portanto, agora nosso 11110001 é entendido como representando
  - 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Percebe que "-" na frente dessa expressão? Isso significa que o bit de sinal carrega o peso -2 7 , ou seja, -128 (base 10). Todas as outras posições mantêm o mesmo peso que tinham em números binários não assinados.

Calculando -15, é
  -128 + 64 + 32 + 16 + 1
Experimente na sua calculadora. é -15.

Das três principais maneiras pelas quais eu vi números negativos representados em computadores, o complemento do 2 ganha as mãos por conveniência em uso geral. Tem uma estranheza, no entanto. Por ser binário, deve haver um número par de combinações de bits possíveis. Cada número positivo pode ser emparelhado com seu negativo, mas há apenas um zero. Negar um zero leva a zero. Portanto, há mais uma combinação, o número com 1 no bit de sinal e 0 em qualquer outro lugar. O número positivo correspondente não caberia no número de bits que está sendo usado.

O que é ainda mais estranho nesse número é que, se você tentar formar um positivo complementando e adicionando um, receberá o mesmo número negativo. Parece natural que o zero faça isso, mas isso é inesperado e não é de todo o comportamento a que estamos acostumados, porque os computadores à parte, geralmente pensamos em um suprimento ilimitado de dígitos, não nessa aritmética de comprimento fixo.

É como a ponta de um iceberg de esquisitices. Há mais espera abaixo da superfície, mas isso é suficiente para esta discussão. Você provavelmente poderá encontrar mais se pesquisar "estouro" de aritmética de ponto fixo. Se você realmente quiser entrar nele, também pode pesquisar "aritmética modular".

ForDummies
fonte
1
Eu gosto desta resposta! Explica como tirar 2s complementa e adiciona um funciona.
SJ.
Eu também gosto dessa resposta. Especialmente onde você mostra como o número negativo é calculado. Aqui eu pensei que o número inteiro estava invertido, não apenas o MSB e depois adicionei de volta os outros valores ponderados. Obrigado, isso resolveu meu bloqueio cerebral
user188757
Bom trabalho mencionando o número ímpar que não tem um inverso. Mas o que fazemos sobre isso? Acabamos de definir o sinalizador de estouro se alguém tentar invertê-lo?
NH.
Enquanto outras respostas se concentram no "como", essa resposta nos leva gentilmente ao "por que". Isso me ajudou. Obrigado!
Abhishek Pathak
Se um número terminar com 11000 ... 000, a inversão resultará em 01000 ... 000. A notação de complemento de dois é baseada na idéia de que todos os dígitos à esquerda do dígito representado mais à esquerda devem ter o mesmo valor que esse dígito, mas ao inverter um número cuja representação é de 1000 ... 000, isso não será verdade.
Supercat
20

O complemento do 2 é muito útil para encontrar o valor de um binário, no entanto, pensei em uma maneira muito mais concisa de resolver esse problema (nunca vi ninguém mais publicá-lo):

tome um binário, por exemplo: 1101 que é [assumindo que o espaço "1" é o sinal) igual a -3 .

usando o complemento de 2, faríamos isso ... virar 1101 para 0010 ... adicionar 0001 + 0010 ===> nos fornecer 0011. 0011 em binário positivo = 3. portanto 1101 = -3 !

O que eu percebi:

em vez de todo o lançamento e a adição, você pode apenas executar o método básico para resolver um binário positivo (digamos 0101) é (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

Faça exatamente o mesmo conceito com um negativo! (Com um pequeno toque)

tome 1101, por exemplo:

para o primeiro número em vez de 2 3 * 1 = 8 , faça - (2 3 * 1) = -8 .

continue como de costume, fazendo -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3

Simon Yundov
fonte
1
Da melhor maneira, pude entender o complemento do 2. Depois de ler isso, eu pude entender todas as respostas para a pergunta acima.
Shakeel Shahzad
1
Este método é mencionado no livro Sistemas de Computadores: uma perspectiva do programador.
jimo
1
Esta é uma maneira muito mais rápida!
Chanzerre 29/08/2015
14

Imagine que você tenha um número finito de bits / trits / dígitos / qualquer coisa. Você define 0 como todos os dígitos sendo 0 e conta naturalmente acima:

00
01
02
..

Eventualmente, você transbordará.

98
99
00

Temos dois dígitos e podemos representar todos os números de 0 a 100. Todos esses números são positivos! Suponha que também queremos representar números negativos?

O que realmente temos é um ciclo. O número antes de 2 é 1. O número antes de 1 é 0. O número antes de 0 é ... 99 .

Portanto, para simplificar, digamos que qualquer número acima de 50 seja negativo. "0" a "49" representam 0 a 49. "99" é -1, "98" é -2, ... "50" é -50.

Essa representação é um complemento de dez . Os computadores geralmente usam o complemento de dois , que é o mesmo, exceto o uso de bits em vez de dígitos.

O bom do complemento de dez é que a adição simplesmente funciona . Você não precisa fazer nada de especial para adicionar números positivos e negativos!

Capitão Segfault
fonte
9

Eu li uma explicação fantástica no Reddit por jng, usando o odômetro como analogia.

insira a descrição da imagem aqui

É uma convenção útil. Os mesmos circuitos e operações lógicas que adicionam / subtraem números positivos no binário ainda funcionam em números positivos e negativos se usar a convenção, é por isso que é tão útil e onipresente.

Imagine o odômetro de um carro, que gira em torno de (digamos) 99999. Se você aumentar 00000, obtém 00001. Se você diminui 00000, obtém 99999 (devido à rolagem). Se você adicionar um de volta a 99999, ele retornará a 00000. Portanto, é útil decidir que 99999 representa -1. Da mesma forma, é muito útil decidir que 99998 representa -2 e assim por diante. Você precisa parar em algum lugar e, também por convenção, a metade superior dos números é considerada negativa (50000-99999), e a metade inferior positiva é apenas uma representação deles (00000-49999). Como resultado, o dígito superior sendo 5-9 significa que o número representado é negativo e 0-4 significa que o representado é positivo - exatamente o mesmo que o bit superior que representa o sinal no número binário complementar de dois.

Compreender isso também foi difícil para mim. Quando o comprei e voltei a reler os artigos e as explicações dos livros (não havia internet naquela época), muitos dos que descreviam o livro não o entendiam realmente. Eu escrevi um livro ensinando linguagem assembly depois disso (que vendeu muito bem por 10 anos).

Alister
fonte
5

Dois complementos são encontrados adicionando um ao primeiro complemento do número fornecido. Digamos que temos que descobrir dois complementos e 10101depois encontrar seus complementos, ou seja, 01010adicionar 1a esse resultado, ou seja 01010+1=01011, qual é a resposta final.

evaa
fonte
4

Vamos obter a resposta 10 - 12 em formato binário usando 8 bits: o que realmente faremos é 10 + (-12)

Precisamos obter a parte de elogio de 12 para subtraí-la de 10. 12 em binário é 00001100. 10 em binário é 00001010.

Para obter a parte complementar de 12, basta reverter todos os bits e adicionar 1. 12 no binário invertido é 11110011. Esse também é o código inverso (complemento de alguém). Agora precisamos adicionar um, que agora é 11110100.

Então 11110100 é o complemento de 12! Fácil quando você pensa dessa maneira.

Agora você pode resolver a questão acima de 10 a 12 em forma binária.

00001010
11110100
-----------------
11111110  
NightSky
fonte
3

Complementos de 2: quando adicionamos um extra aos complementos de 1 de um número, obtemos os complementos de 2. Por exemplo: 100101, o complemento de 1 é 011010 e o complemento de 2 é 011010 + 1 = 011011 (Ao adicionar um com o complemento de 1) Para obter mais informações, este artigo explica graficamente.

Milon
fonte
plus1 para o link que tem uma explicação com círculo #
Manohar Reddy Poreddy 31/12/15
3

Olhando para o sistema de complemento dos dois do ponto de vista matemático, realmente faz sentido. No complemento de dez, a idéia é essencialmente "isolar" a diferença.

Exemplo: 63 - 24 = x

Adicionamos o complemento de 24, que é realmente justo (100 - 24). Então, realmente, tudo o que estamos fazendo é somar 100 nos dois lados da equação.

Agora a equação é: 100 + 63 - 24 = x + 100, é por isso que removemos os 100 (ou 10 ou 1000 ou o que for).

Devido à situação inconveniente de ter que subtrair um número de uma longa cadeia de zeros, usamos um sistema de 'complemento de raiz diminuída', no sistema decimal, o complemento de nove.

Quando somos apresentados a um número subtraído de uma grande cadeia de nove, precisamos apenas reverter os números.

Exemplo: 99999 - 03275 = 96724

Essa é a razão, após o complemento de nove, adicionamos 1. Como você provavelmente sabe da matemática da infância, 9 se torna 10 ao 'roubar' 1. Então, basicamente, é apenas o complemento de dez que tira 1 da diferença.

Em binário, o complemento de dois é igual ao complemento de dez, enquanto o complemento de um ao complemento de nove. A principal diferença é que, em vez de tentar isolar a diferença com potências de dez (adicionando 10, 100, etc. na equação), estamos tentando isolar a diferença com potências de dois.

É por esse motivo que invertemos os bits. Assim como nosso minuendo é uma cadeia de nove em decimal, nosso minuendo é uma cadeia de unidades em binário.

Exemplo: 111111 - 101001 = 010110

Como cadeias de uns estão 1 abaixo de uma potência agradável de dois, elas 'roubam' 1 da diferença, como o nove faz em decimal.

Quando estamos usando números binários negativos, estamos apenas dizendo:

0000 - 0101 = x

1111 - 0101 = 1010

1111 + 0000 - 0101 = x + 1111

Para 'isolar' x, precisamos adicionar 1, porque 1111 está um longe de 10000 e removemos o 1 inicial, porque apenas o adicionamos à diferença original.

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10000

Basta remover 10000 de ambos os lados para obter x, é álgebra básica.

KyBrooks
fonte
3

Até agora, muitas das respostas explicam muito bem por que o complemento de dois é usado para representar um número negativo, mas não nos diz qual é o número do complemento de dois, particularmente não o porquê de um '1' ser adicionado e, de fato, frequentemente adicionado de maneira errada.

A confusão vem de uma compreensão insuficiente da definição de um número de complemento. Um complemento é a parte que faltava que faria algo completo.

O complemento de raiz de um número de dígito n x na raiz b é, por definição, b ^ nx. No binário 4 é representado por 100, que possui 3 dígitos (n = 3) e uma raiz de 2 (b = 2). Portanto, seu complemento de raiz é b ^ nx = 2 ^ 3-4 = 8-4 = 4 (ou 100 em binário).

Entretanto, na obtenção binária de um complemento de raiz, não é tão fácil quanto obter seu complemento de raiz reduzido, que é definido como (b ^ n-1) -y, apenas 1 a menos do que o complemento de raiz. Para obter um complemento de raiz reduzido, basta girar todos os dígitos.

100 -> 011 (complemento de raiz diminuído (um))

para obter o complemento de raiz (dois), basta adicionar 1, conforme a definição definida.

011 +1 -> 100 (complemento de dois).

Agora, com esse novo entendimento, vamos dar uma olhada no exemplo dado por Vincent Ramdhanie (veja a segunda resposta acima)

/ * início de Vincent

Convertendo 1111 para decimal:

O número começa com 1, então é negativo, então encontramos o complemento de 1111, que é 0000. Adicione 1 a 0000 e obtemos 0001. Converta 0001 em decimal, que é 1. Aplique o sinal = -1. Tada!

fim de Vincent * /

Deve ser entendido como

O número começa com 1, então é negativo. Portanto, sabemos que é um complemento de dois de algum valor x. Para encontrar o x representado pelo complemento de dois, primeiro precisamos encontrar o complemento de 1.

complemento de dois de x: 1111 complemento de dois de x: 1111-1 -> 1110; x = 0001, (inverta todos os dígitos)

aplique o sinal - e a resposta = -x = -1.

user779764
fonte
3

A palavra complemento deriva da completude. No mundo decimal, os números de 0 a 9 fornecem um complemento (conjunto completo) de números ou símbolos numéricos para expressar todos os números decimais. No mundo binário, os números 0 e 1 fornecem um complemento de números para expressar todos os números binários. De fato, os símbolos 0 e 1 devem ser usados ​​para representar tudo (texto, imagens, etc.), além de positivos (0) e negativos (1). Em nosso mundo, o espaço em branco à esquerda do número é considerado zero:

                  35=035=000000035.

Em um local de armazenamento do computador, não há espaço em branco. Todos os bits (dígitos binários) devem ser 0 ou 1. Para um uso eficiente, os números de memória podem ser armazenados como representações de 8 bits, 16 bits, 32 bits, 64 bits, 128 bits. Quando um número que é armazenado como um número de 8 bits é transferido para um local de 16 bits, o sinal e a magnitude (valor absoluto) devem permanecer os mesmos. As representações do complemento 1 e 2 complementam isso. Como substantivo: o complemento de 1 e o complemento de 2 são representações binárias de quantidades assinadas, onde o bit mais significativo (o da esquerda) é o bit de sinal. 0 é para positivo e 1 é para negativo. Complemento 2s não significa negativo. Significa uma quantidade assinada. Como em decimal, a magnitude é representada como a quantidade positiva. A estrutura usa extensão de sinal para preservar a quantidade ao promover para um registro [] com mais bits:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Como verbo: o complemento de 2 significa negar . Isso não significa fazer negativo. Significa se negativo faz positivo; se positivo, negativo. A magnitude é o valor absoluto:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Essa capacidade permite subtração binária eficiente usando negar e depois adicionar. a - b = a + (-b)

A maneira oficial de obter o complemento 1 é para cada dígito subtrair seu valor de 1.

        1'scomp(0101) = 1010.

É o mesmo que inverter ou inverter cada bit individualmente. Isso resulta em um zero negativo que não é muito apreciado, portanto, adicionar um ao complemento de te 1 se livra do problema. Para negar ou usar o complemento 2s, primeiro pegue o complemento 1s e adicione 1.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

Nos exemplos, a negação também funciona com números estendidos de sinal.

Adicionando:
1110 Carry 111110 Carry 0110 é o mesmo que 000110 1111 111111 soma 0101 soma 000101

Subtraindo:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

Observe que, ao trabalhar com o complemento de 2, o espaço em branco à esquerda do número é preenchido com zeros para números positivos, mas é preenchido com outros para números negativos. O transporte é sempre adicionado e deve ser 1 ou 0.

Felicidades

Russ
fonte
3

O complemento de 2 é essencialmente uma maneira de criar o inverso aditivo de um número binário. Pergunte a si mesmo: Dado um número em forma binária, que padrão de bits, quando adicionado ao número original, tornaria o resultado zero? Se você pode criar esse padrão de bits, esse padrão de bits é a representação -ve (inversa aditiva) do número original; pois, por definição, adicionar um número ao seu inverso aditivo deve sempre resultar em zero. Exemplo: pegue 101, que é decimal 5. Agora, a tarefa é apresentar um padrão de bits que, quando adicionado ao padrão de bits fornecido (101), resultaria em zero. Para fazer isso, comece com o bit mais à direita de 101 e, para cada bit individual, faça novamente a mesma pergunta: Que bit devo adicionar ao bit "this" para tornar o resultado zero? continue fazendo isso levando em consideração a transferência habitual. Depois que terminamos com os três lugares certos (os dígitos que definem o número original sem considerar os zeros à esquerda), o último carregamento segue o padrão de bits do inverso aditivo. Além disso, como poderíamos manter o número original, digamos, um único byte, todos os outros bits iniciais no inverso aditivo também devem ser 1's, de modo que quando o computador adicionar o número e seu aditivo inverso usando o tipo de armazenamento "char" (char) o resultado nesse caractere seria todos os zeros.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0
n-mam
fonte
2

Gostei da resposta de lavinio, mas a troca de bits acrescenta alguma complexidade. Freqüentemente, há uma escolha de bits em movimento, respeitando o bit de sinal ou sem respeitar o bit de sinal. Essa é a opção entre tratar os números como assinados (-8 a 7 para um nibble, -128 a 127 para bytes) ou números não assinados de intervalo completo (0 a 15 para nibbles, 0 a 255 para bytes).

Nosredna
fonte
2

É um meio inteligente de codificar números inteiros negativos de maneira que aproximadamente metade da combinação de bits de um tipo de dados seja reservada para números inteiros negativos, e a adição da maioria dos números inteiros negativos com seus números inteiros positivos correspondentes resulta em um excesso de carga isso deixa o resultado como zero binário.

Portanto, no complemento de 2, se um é 0x0001, então -1 é 0x1111, porque isso resultará em uma soma combinada de 0x0000 (com um estouro de 1).

Edwin Buck
fonte
1

O complemento de dois é uma das formas de expressar um número negativo e a maioria dos controladores e processadores armazena um número negativo na forma de complemento de 2

Denis Roosevelt
fonte
1
Isso não adiciona nada às informações fornecidas por outras respostas.
Adrian Mole
1

O complemento de Two é usado principalmente pelos seguintes motivos:

  1. Para evitar várias representações de 0
  2. Para evitar acompanhar o bit de transporte (como no complemento) em caso de estouro.
  3. Realizar operações simples como adição e subtração se torna fácil.
K.N. Bhargav
fonte
0

REFERÊNCIA: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Eu inverto todos os bits e adiciono 1. Programaticamente:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;
Charles Thomas
fonte
Mesmo montador seria muito alto nível. Precisa ver um esquema da lógica de adição no nível do portão. Com ciclos T. Você está algoritmicamente correto.
Mckenzm
0

O complemento de 2 de um determinado número é o não. obtendo adicionando 1 com o complemento 1 do não. suponha que tenhamos um número binário: 10111001101 O complemento de 1 é: 01000110010 E o complemento de 2 será: 01000110011

user10862846
fonte
0

Completar bit a bit um número é inverter todos os bits nele. Para complementá-lo, giramos todos os bits e adicionamos um.

Usando a representação de complemento de 2 para números inteiros assinados, aplicamos a operação de complemento de 2 para converter um número positivo em seu equivalente negativo e vice-versa. Portanto, usando nibbles como exemplo, 0001(1) torna-se 1111(-1) e, aplicando o op novamente, retorna para 0001.

O comportamento da operação em zero é vantajoso ao fornecer uma única representação para zero sem manipulação especial de zeros positivos e negativos. 0000complementa a 1111, que quando 1 é adicionado. transborda para 0000, dando-nos um zero, em vez de positivo e negativo.

Uma vantagem importante dessa representação é que os circuitos de adição padrão para números inteiros não assinados produzem resultados corretos quando aplicados a eles. Por exemplo, adicionando 1 e -1 em petiscos:0001 + 1111 os bits transbordam do registro, deixando para trás 0000.

Para uma introdução suave, o maravilhoso Computerphile produziu um vídeo sobre o assunto .

ahcox
fonte
0

Em termo simples 2's Complement é uma maneira de armazenar um número negativo na Memória do Computador. Enquanto os números positivos são armazenados como número binário normal.

Vamos considerar este exemplo,

O computador usa Binary Number Systempara representar qualquer número.

x = 5;

Isso é representado como 0101.

x = -5;

Quando o computador acopla -, ele calcula o complemento de 2 e o armazena. i.e5 = 0101 e o complemento de 2 é 1011.

As regras importantes usadas pelo computador para processar números são,

  1. Se o primeiro bit for 1, deve ser o negativenúmero.
  2. Se todos os bits, exceto o primeiro, forem 0, é um número positivo, porque não existe um -0sistema numérico (em 1000 is not -0vez disso, é positivo 8)
  3. Se todos os bits são, 0então é 0.
  4. Senão é um positive number.
Raghu
fonte
-6

A resposta mais simples:

1111 + 1 = (1) 0000. Então 1111 deve ser -1. Então -1 + 1 = 0.

É perfeito entender tudo isso para mim.

Dmitry
fonte
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem.
Codor 5/10
É resposta. O mais simples. Para mim - o melhor.
Dmitry