Ajuda com binário (complemento pa 1 e 2, excesso)

Nazgulled

Power Member
Eu sei que isto não tem muito a ver com programação, mas o pessoal que para neste fórum especifico deve ser o que melhor se enquadra para me ajudar com isto.

Como uma imagem vale por mil palavras, vejam a seguinte:


1) Isso é a minha resposta aos exercícios e gostava de saber se está tudo correcto ou não. Se estiver então o meu raciocínio esta correcto. Se não, podem-me explicar o que fiz mal e como se faz direito?

2) Podem ver que o exercício #6, falta-lhe umas respostas. Não as sei responder e gostava que me dessem as respostas bem como me explicassem como chegaram a essas mesmas respostas.

Espero que alguém me possa ajudar pois isto está a dar-me a volta a cabeça...
 
Em Relacao a tua resolucao parece estar tudo bem, fiz a conversao do 1 e do 2 exercicio e os complementos/sinais e deu.me exactamente igual por isso suponho que esta tudo bem. em relacao ao 6 exercicio, dscpa la mas nao sei fazer xD
 
O que me esta a dar a volta a cabeça é que nalguns documentos vejo a falarem que o complemento para 1 de um número qualquer é trocar TODOS os números. Mas na maior parte das tabelas que encontro a representar as mais comuns representações de binário (por exemplo para 4-bits), todas elas trocam todos os números com a excepção do bit do sinal (que foi o que eu fiz nos exercícios). Mas isso está-me a confundir e não estou a perceber quando devo trocar todos ou todos com excepção do bit do sinal...

Quanto ao exercício 6, se alguém tiver ideias...
 
Eu acho que o exercicio 1 e 2 estão errados porque quando fazes o complemento para um para dois afectas todos os bits incluindo o de sinal até porque se estás o fazer o complemente é suposto o bit de sinal mudar isto é passar de positivo para negativo ou vice-versa.

Quanto ao último exercicio tmbém não te posso ajudar porque não consigo sequer perceber a pergunta...
 
Esse o mal das pessoas que "acham". Tipo, não estou a criticar, não és obrigado (nem ninguém) a saber tudo direitinho mas é por isso que vim pedir ajuda, mas estava mesmo à procura de respostas de quem realmente perceba do assunto para que possa esclarecer isto.

No entanto, já tive respostas de várias outras pessoas que me disseram que estava tudo correcto. E de certa forma até entendo mas lá está, queria alguém que realmente soubesse do que fala. Mas ha algo que tu disseste que eu penso estar mal, que é o passar de positivio para negativo. Eu não "passei" nada, não estou a converter nada, o número já é negativo (-233) e o objectivo do exercicio não é converter para 233 mas sim, representar o -233 em complemento para 1, complemento para 2 e excesso. E desta forma, representar um número negativo usando os complementos, não se troca o bit do sinal porque eu não quero converter o número para negativo/positivo (conforme o caso).

Eu penso que é isto, mas precisava de alguém que me confirmasse a serio...
 
Compreende o que tu dizes e tens razão...

Mas quando respondi a tua pergunta respondi pensando que o objectivo fosse "negar" o número e se o objectivo for esse tens mesmo que trocar todos os bits (disto tenho a certeza). Em relação a tua verdadeira dúvida não te posso ajudar porque nunca vi um exercicio como esse e nem vejo utilidade num exercicio como esse.

Aconselho-te a ver: http://en.wikipedia.org/wiki/Two's_complement.
 
Complemento para dois eu uso este método.

Pegas no valor extendido a X bits que queres usar. Exemplo Queres converter o número -28 para complemento para dois para 8 bits.

1- Pegas no valor em modulo e apos o pores em binario, extendes aos 8 bits:
Ex: = 28 (10) = 0001 1100 (2)

2-vendo da direita para a eskerda, até chegeres ao 1º 1 INCLUSIVE, não trocas, e trocas tudo o resto.
Ex: = 28-> 0001 1100 ; -28 -> 1110 0100

Aqui tens o -28 em binario, a 8 bits e em complemento para dois 1110 0100 ou 0xE4

Outros livros/pessoas usam outro metodo, que e somar um ou qq coisa do genero, que é a mesma coisa que trocar todos os numeros à esquerda do 1º bit a 1.
 
Vamos lá ver se consigo explicar isto de uma forma...digamos...expedita! :D

Exercício 2:
Pretende-se representar um nº negativo (-233). Logo para representar em:
a) Sinal+Amplitude: Convertes o valor positivo do nº (233) para binário e de seguida trocas o 1º bit para 1 (porque é negativo).
b) Compl. p/1: Pegas no valor binário do nº positivo (233) e invertes os bits TODOS.
c) Compl. p/2: Igual ao anterior mas somas 1 no fim.
d) Excesso 2^(n-1): 2^(n-1) = 2^(10-1) = 2^9 = 512. 512 - 233 = 279. Convertes para binário e está feito.

Exercício 3:
Como o nº em binário começa por 1, deduzes que é negativo. Logo para representar em:
a) Inteiro sem sinal: Passas o nº todo para decimal.
b) Sinal+Amplitude: Ignoras o 1º bit e fazes as contas com o resto para passares para decimal e no fim, colocas o sinal - antes do valor que te deu como resultado.
c) Compl. p/1: Como já sabes que o nº em binário é negativo, podes ignorar o 1º bit, depois invertes todos os restantes e fazes as contas. No fim acrescentas o sinal - ao resultado.
d) Compl. p/2: A mesma coisa que o anterior, mas somas 1 depois de inverteres.
e) Excesso 2^(n-1): 2^9 = 512. 512 -117 = 395. Convertes para binário.

6)
ii a) Em compl. p/2 a gama de valores varia entre -2^(n-1) e 2^(n-1) - 1. Logo: [-32,+31].
ii b) [-2048,+2047]

Esta do excesso não tenho a certeza, mas como no excesso 127, a gama de valores varia entre -126 e +127 deduzi que em excesso 2^(n-1) a gama de valores varia entre -2^(n-1) + 1 e 2^(n-1):

iii a) [-31,+32].
iii b) [-2047,+2048]

Pormenores a ter em conta:
- Em compl. p/1 e p/2, se o 1º bit é 1, então o nº é negativo, senão é positivo. (caso especial para o 0 em compl. p/1)
- Se precisares de completar o nº com bits até ao tamanho pedido pelo enunciado tens 2 hipóteses:
a) Se for em Sinal+Amplitude, acrescentas 0's à esquerda e o último bit que acrescentas fica 0 se for positivo ou 1 se for negativo
b) Se for em compl. p/1 ou p/2, basta fazer a extensão do sinal (acrescentar 0's se for positivo ou 1's se for negativo).

Pelo que vi tens tudo certo.
 
Última edição:
Só agora depois da explicação dada é que percebi o objectivo do exercicio (que continuo a achar sem lógica nenhuma mas pronto) e tal como disseram tens as perguntas 2 e 3 certas (execepto a parte do excesso 2^(n-1)).

Quanto à 6):

-31 a 31 | 100001 a 011111
-2047 a 2047 | 100000000001 a 011111111111

Para a última coluna deve ser "só" converter para excesso 2^(n-1).

Alguém sabe dizer em que é usado o excesso 2^(n-1)??
 
Só agora depois da explicação dada é que percebi o objectivo do exercicio (que continuo a achar sem lógica nenhuma mas pronto) e tal como disseram tens as perguntas 2 e 3 certas (execepto a parte do excesso 2^(n-1)).

Eu acho que a parte do excesso também está certa.

Alguém sabe dizer em que é usado o excesso 2^(n-1)??

É importante para depois perceber como são representados os expoentes nos números de vírgula flutuante.

Quanto à 6):

-31 a 31 | 100001 a 011111
-2047 a 2047 | 100000000001 a 011111111111

Podias explicar?
 
Pegas no valor extendido a X bits que queres usar. Exemplo Queres converter o número -28 para complemento para dois para 8 bits.

1- Pegas no valor em modulo e apos o pores em binario, extendes aos 8 bits:
Ex: = 28 (10) = 0001 1100 (2)

2-vendo da direita para a eskerda, até chegeres ao 1º 1 INCLUSIVE, não trocas, e trocas tudo o resto.
Ex: = 28-> 0001 1100 ; -28 -> 1110 0100

Aqui tens o -28 em binario, a 8 bits e em complemento para dois 1110 0100 ou 0xE4
Mas isto é exactamente o que eu fiz com a diferença de não trocar o bit do sinal. O resultado é o mesmo. Ou seja, tu usas o valor em módulo e trocas TODOS, eu uso o próprio número negativo mas não troco o bit do sinal. Vai dar ao mesmo.

Outros livros/pessoas usam outro metodo, que e somar um ou qq coisa do genero, que é a mesma coisa que trocar todos os numeros à esquerda do 1º bit a 1.
Não, isso é diferente, o método que tu usas é o mais simples, mais directo. O metodo que ensinam sempre primeiro para passar um número para complemento para 2 é primeiro fazer-lhe o complemento para 1 e depois somar 1, isso é que é o complemento para dois. Esse método que tu falas, é só um método mais fácil de chegar ao complemento para dois.

Exercício 2:
Pretende-se representar um nº negativo (-233). Logo para representar em:
a) Sinal+Amplitude: Convertes o valor positivo do nº (233) para binário e de seguida trocas o 1º bit para 1 (porque é negativo).
b) Compl. p/1: Pegas no valor binário do nº positivo (233) e invertes os bits TODOS.
c) Compl. p/2: Igual ao anterior mas somas 1 no fim.
d) Excesso 2^(n-1): 2^(n-1) = 2^(10-1) = 2^9 = 512. 512 - 233 = 279. Convertes para binário e está feito.

Exercício 3:
Como o nº em binário começa por 1, deduzes que é negativo. Logo para representar em:
a) Inteiro sem sinal: Passas o nº todo para decimal.
b) Sinal+Amplitude: Ignoras o 1º bit e fazes as contas com o resto para passares para decimal e no fim, colocas o sinal - antes do valor que te deu como resultado.
c) Compl. p/1: Como já sabes que o nº em binário é negativo, podes ignorar o 1º bit, depois invertes todos os restantes e fazes as contas. No fim acrescentas o sinal - ao resultado.
d) Compl. p/2: A mesma coisa que o anterior, mas somas 1 depois de inverteres.
e) Excesso 2^(n-1): 2^9 = 512. 512 -117 = 395. Convertes para binário.
Basta teres dito que o que eu fiz está correcto lol. Porque ya, mais coisa menos coisa, foi isso que eu fiz. Eu só tinha confundido umas coisas que agora acho que já consegui entender.

6)
ii a) Em compl. p/2 a gama de valores varia entre -2^(n-1) e 2^(n-1) - 1. Logo: [-32,+31].
ii b) [-4096,+4095]
Não te enganaste no ii)? Não seria mais [-2048, +2027] ?

De qualquer forma, a minha dúvida aqui é mais porque é que o resultado é este? Isto (-2^(n-1) e 2^(n-1) - 1) é alguma regrar que convém saber? Queria perceber porquê que é assim, se é que me entendes. Porque eu até já tinha chegado a este resultado porque vi noutros exemplos, mas queria perceber o porquê...

Quanto ao exercício 6 na parte do excesso ainda parece haver discordância, fico caladinho a ver o desenlace da vossa conversa... :P
 
Não te enganaste no ii)? Não seria mais [-2048, +2027] ?

Ya, enganei-me, já tinha visto o erro e acabei por não corrigir. [-2048,+2047]

De qualquer forma, a minha dúvida aqui é mais porque é que o resultado é este? Isto (-2^(n-1) e 2^(n-1) - 1) é alguma regrar que convém saber? Queria perceber porquê que é assim, se é que me entendes. Porque eu até já tinha chegado a este resultado porque vi noutros exemplos, mas queria perceber o porquê...

Eu vi essa regra num pdf que tenho. Explicação há sempre, mas eu não sou grande mestre nesta área...:sad:
 
Já percebi o objectivo do exercicio...

Para 6 bits:
1) Qual o valor maximo e minimo que se pode representar com 5 bits + sinal?
R: Max = 2^5 - 1 = 31. Min = - (2^5 - 1) = -31

Então em i) fica -31 a 31.

2) Qual o valor maximo e minimo que se pode representar em complemento para um?
R: Max = 2^5 - 1 = 31. Min = - (2^5 - 1) = -31

Então em ii), tal como em i), fica -31 a 31.

3) Qual o valor maximo e minimo que se pode representar em complemento para dois?
R: Max = 2^5 - 1 = 31. Min = - 2^5 = -32.
Explicação: se pegares em 100000b => 0111111b => 100000b = 32, ou seja 100000b é -32.

Então em iii) fica -32 a 31.

Para 12 bits é só fazer a analogia:
i) -4095 a 4095
ii) -4095 a 4095
iii) -4096 a 4095

Esses enunciados são um bocado manhosos...
 
3) Qual o valor maximo e minimo que se pode representar em complemento para dois?
R: Max = 2^5 - 1 = 31. Min = - 2^5 = -32.
Explicação: se pegares em 100000b => 0111111b => 100000b = 32, ou seja 100000b é -32.

Então em iii) fica -32 a 31.

0111111b -> puseste um 1 a mais.
Então, tipo: 100000 = 32 e 011111 = 31, mas como é representado em compl. p/2 o 1º bit indica o sinal, logo fica [-32,+31] ?

Para 12 bits é só fazer a analogia:
i) -4095 a 4095
ii) -4095 a 4095
iii) -4096 a 4095

Não te enganaste? Acho que fizeste os cálculos com 2^12.
 
Acho que vou deixar a parte da gama de valores em excesso para um prof porque já me tão a comer a cabeça toda.

Obrigado pela ajuda, isto tinha sido em cheio ontem, mas hoje também serve :P
 
0111111b -> puseste um 1 a mais.
Tens razão...

A explicação e um bocado vaga, mas tenho a certeza daquilo que estou a dizer. Para justificar posso dizer que (em complemento para dois) sempre que converto um número negativo para positivo ignoro o bit de sinal.

Se tentares fazer contas com o -32 vez que funcionam perfeitamente em complemento para 2.
(Atenção que não funcionam em complemento para um, daí a i) ser igual à ii)).
 
Como não tenho tempo para explicar, posso arranjar-te umas apresentações de uma cadeira em que falei disso. Diz alguma coisa se ainda precisares...
 
Eu sei a regra e isso chega para resolver, mas por acaso gostava de perceber como é que a coisa funciona.

EDIT: Agora que reparei, eu obtive os mesmos resultados que tu. A única dúvida era mesmo no excesso 2^(n-1).
 
Bem, eu não percebo nada disto (ou seja, não tenho nenhuma cadeira onde me tenham ensinado isto) mas depois de ler os links...

"A representação binária para um valor x qualquer em excesso de 2^(n-1) é calculada da seguinte forma:
x + 2^(n-1)"


Então acho que posso tirar as seguintes conclusões:

O menor valor que x pode tomar é -2^(n-1) ou seja, representando por 0 (x + 2^(n-1) = 0). Sabemos ainda que estamos a representar em n bits, o que faz com que x + 2^(n-1) <= 2^n - 1, correcto? (Com 8 bits representamos os números de 0 a 255, com n bits representamos de 0 a 2^n - 1). Então é trivial resolver a inequação e ver que x <= 2^n - 2^(n-1) - 1 = 2^(n-1) * (2 - 1) - 1 = 2^(n-1) - 1.


Está demonstrado que a gama de valores 'x' representáveis por excesso de 2n-1 é:
[-2^(n-1) , 2^(n-1) -1]

Estarei correcto?​
 
Última edição:
http://www.cs.grinnell.edu/~rebelsky/Courses/CS152/97F/Readings/student-binary.html#excess
n this notation, "m" indicates the total number of bits. For us (working with 8 bits), it would be excess 2^7. To represent a number (positive or negative) in excess 2^7, begin by taking the number in regular binary representation. Then add 2^7 (=128) to that number. For example, 7 would be 128 + 7=135, or 2^7+2^2+2^1+2^0, and, in binary,10000111. We would represent -7 as 128-7=121, and, in binary, 01111001.

Note:
Unless you know which representation has been used, you cannot figure out the value of a number.
A number in excess 2^(m-1) is the same as that number in two's complement with the leftmost bit flipped.

Só agora é que reparei que iii) fazia referencia à notação excesso 2^(n-1) e não a complemento para dois daí que na minha explição a iii) é na realidade a ii) e a ii) fica sem efeito. Desculpem lá esta minha estupides e muita falta de atenção...
 
Back
Topo