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
0100
para 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
1100
para 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 1000
como "zero negativo", o que é confuso. Geralmente, você só precisa se preocupar com isso ao trabalhar perto do hardware.
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
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
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 é
?
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
Converta o número em binário (ignore o sinal por enquanto), por exemplo, 5 é 0101 e -5 é 0101
Se o número for positivo, estará pronto. por exemplo, 5 é 0101 em binário usando a notação de complemento de dois.
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.
Convertendo o complemento de dois em decimal
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 obteremos 0001.
Converta 0001 em decimal, que é 1.
Aplique o sinal = -1.
Tada!
fonte
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".
fonte
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
fonte
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:
Eventualmente, você transbordará.
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!
fonte
Eu li uma explicação fantástica no Reddit por jng, usando o odômetro como analogia.
fonte
Dois complementos são encontrados adicionando um ao primeiro complemento do número fornecido. Digamos que temos que descobrir dois complementos e
10101
depois encontrar seus complementos, ou seja,01010
adicionar1
a esse resultado, ou seja01010+1=01011
, qual é a resposta final.fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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:
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:
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:
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.
É 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.
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:
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
fonte
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.
fonte
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).
fonte
É 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).
fonte
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
fonte
O complemento de Two é usado principalmente pelos seguintes motivos:
fonte
REFERÊNCIA: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
Eu inverto todos os bits e adiciono 1. Programaticamente:
fonte
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
fonte
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-se1111
(-1) e, aplicando o op novamente, retorna para0001
.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.
0000
complementa a1111
, que quando 1 é adicionado. transborda para0000
, 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ás0000
.Para uma introdução suave, o maravilhoso Computerphile produziu um vídeo sobre o assunto .
fonte
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 System
para representar qualquer número.Isso é representado como
0101
.Quando o computador acopla
-
, ele calcula o complemento de 2 e o armazena.i.e
5 = 0101 e o complemento de 2 é1011
.As regras importantes usadas pelo computador para processar números são,
1
, deve ser onegative
número.0
, é um número positivo, porque não existe um-0
sistema numérico (em1000 is not -0
vez disso, é positivo8
)0
então é0
.positive number
.fonte
Você também pode usar uma calculadora on-line para calcular a representação binária do complemento de dois de um número decimal: http://www.convertforfree.com/twos-complement-calculator/
fonte
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.
fonte