• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

Aritmética com números binários

26 mensagens neste tópico

Estou aqui com outro problema com números binários, que espero que me possam ajudar...

7.Aritmética de inteiros

Efectue os seguintes cálculos usando aritmética binária de 8-bits em complemento para 2:

a) 4 + 120

b) 70 + 80

c) 100 + (–60)

d) –100 – 27

a)

4 + 120 = 124

4 = 0000 0100 (S+M)

120 = 0111 1000 (S+M)

  0000 0100
+ 0111 1000
-----------------
  0111 1100 (124)

b)

70 + 80 = 150

70 = 0100 0110

80 = 0101 0000

  0100 0110
+ 0101 0000
-----------------
  1001 0110 (150)

Dúvida #1) Em ambas as alíneas os números são positivos, ou seja, o complemento para 2 é igual ao próprio valor com sinal. O que significa que posso fazer as contas como fiz acima, correcto?

Dúvida #2) Ignora-se o bit do sinal? Tipo, se ignorar, da 150, se não dá 22... e isto estaria incorrecto. Right?

Dúvida #3) Alguém me ajuda a resolver as seguintes alíneas? Ando aqui ás voltas no papel e não consigo...

P.S: Não vou por este tópico na TZ pois vocês, como programadores, é que são mais obrigados a ter conhecimentos nesta área, só que no tópico anterior, obtive respostas mais rapidamente na TZ, mas gostar de as obter ainda mais rapidamente aqui... :P Vá, ajudem-me lá que eu agradeço imenso ;) E este problema parece-me ser mais simples que o anterior...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção aos overflows, que é o que acontece no (b).


Para o c:

100 -> 01100100

-60 -> 0111100 -> 1000011 -> 1000100 -> 11000100

Acho que se pode somar directamente (mas já não vejo isto há algum tempo)...

01100100

11000100

-------------

00101000 (32+8)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu acho que não se ignora o primeiro bit, o de sinal, na realidade esse 150 deve dar overflow como diz o Rui Carlos. A representação é a de 150 (1001 0110), mas no contexto desta aritmética vai ser interpretado como -106 (e não 22, não te esqueças que o número é interpretado como -(bit_sinal)*2^7 + interpretação normal do resto do número, ou seja, 22 - 128 = -106), exactamente por causa do overflow.

Em relação aos outros é aritmética normal, penso eu...

c) 100 + (-60)

    0110 0100
+ 1100 0100
----------------
     0010 1000

=40 !!!

(No bit de sinal dá 0 porque o "e vai 1" do sétimo bit vale 1 mas o 1 que lá estava vale -1 na realidade - ou seja, vai 1 de trás que vale 128, mas o 1 do sinal vale -128 como disse atrás).

d) -100 + (-27)

    1001 1100
+ 1110  0101
-----------------
    1000   0001

= -127

(Mais uma vez há que ter em conta que aqueles 1's são -1's, ou melhor, -128's, o que "vem de trás" é 1 logo ficamos com um "-1" que é o 1 bit de sinal).

EDIT: na realidade o que se passa é que o circuito somador não tem 9º bit e como tal limita-se a somar o que tem e a colocar o que ficaria no 8º bit, independentemente de haver 9º bit ou não, a história do "-128" e etc. é mais para explicar porque é que as contas funcionam.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi bem essa tua conversão do -60 Rui Carlos... O que é que tu fizeste ai?

Eu agora não tenho tempo para ver a sério as vossas explicações, tenho de sair, mas farei logo a noite. No entanto, podem dar uma explicação + explicita e simples, porquê que o b) dá overflow?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi bem essa tua conversão do -60 Rui Carlos... O que é que tu fizeste ai?

Eu agora não tenho tempo para ver a sério as vossas explicações, tenho de sair, mas farei logo a noite. No entanto, podem dar uma explicação + explicita e simples, porquê que o b) da overflow?

60 = 00111100

-60 = 11000100 (compl. p/2)

Segundo o meu ponto de vista, o b) dá overflow porque, como estamos a trabalhar em compl. p/2 com 8 bits, a gama de valores é [-128,+127] e o 150 está fora deste intervalo. (provavelmente não tem nada a ver, porque eu pensava que overflow acontecia quando eram precisos mais bits para representar o valor, por exemplo, se fossem precisos 9 bits para representar o 150...).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(provavelmente não tem nada a ver, porque eu pensava que overflow acontecia quando eram precisos mais bits para representar o valor, por exemplo, se fossem precisos 9 bits para representar o 150...).

Aqui também são precisos mais bits para representar o 150... Como tu disseste, com 8 só vais até 127.


Para o -60 a lógica que segui foi esta:

Representas 60 em binário: 0111100

Invertes o bits: 1000011

Adicionas 1 unidade: 1000100

Adicionas o bit do sinal: 11000100

Podia-se fazer logo com o bit do sinal:

Representas 60 em binário: 00111100

Invertes o bits: 11000011

Adicionas 1 unidade: 11000100

Quanto a explicações, estes são os passos para representar um número em complemento para 2 (se é negativo, invertem-se os bits, e soma-se uma unidade).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui também são precisos mais bits para representar o 150... Como tu disseste, com 8 só vais até 127.

Mas pelas contas, 150 = 10010110 (8 bits). Não estou a perceber esta cena...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exactamente o que o Rui Carlos disse.

Se reparares podes representar os números [-128, 127], isto acontece porque tal como eu disse um 1 no bit de sinal faz com que se subtraia 128 ao número. Como eu gosto de aritmética de base 10 (lol) quero representar o número, -60 por exemplo. Então tenho que ter x - 128 = -60, faço as contas de cabeça, x= 128 - 60 = 68 e represento 68 nos bits a seguir ao bit de sinal, 1100 0100 (isto porque tenho mais facilidade em fazer a conta e em seguida representar um número em binário de cabeça do que, em representar e depois imaginar a inversão dos bits e adicionar uma unidade).

Mas pelas contas, 150 = 10010110 (8 bits). Não estou a perceber esta cena...

Repara Baderous, que o primeiro bit é de sinal, apenas diz se devemos ou não subtrair 128 ao número seguinte. A forma como estás a representar 150 é numa aritmética de inteiros sem sinal em que o 1º bit representa se devemos ou não adicionar 128.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu estou a fazer alguma confusão.

Já percebi que o resultado de 70+80 = 10010110 que, como está representado em compl. p/2, representa o -106. Até aqui já percebi.

Mas agora não estou a perceber como se relaciona este -106 com o 150 e com o overflow. :/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu estou a fazer alguma confusão.

Já percebi que o resultado de 70+80 = 10010110 que, como está representado em compl. p/2, representa o -106. Até aqui já percebi.

Mas agora não estou a perceber como se relaciona este -106 com o 150 e com o overflow. :/

O valor que queres representar excede o máximo permito pela representação usada, logo tens um overflow.

A representação usada não é binário, é complemento para 2. Em binário não tens overflow, mas em complemento para 2 tens.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não li os posts todos porque estou com pressa (sei que não o devo fazer), mas caso ainda existam dúvidas:

Em c/2:

Convertes os dois números para complemento para 2. Verificas se é possível. (no exemplo b) o 150 dá overflow)

Somas os dois números, bit de sinal incluído, não se deixa de parte.

Se somares dois números positivos e o bit da esquerda for 1, deu overflow.

Se somares dois negativos e o bit da esquerda for 0, deu overflow.

A vantagem do complemento para dois é que te podes limitar a somar os números sem te preocupares se são negativos ou positivos, pois somas bit de sinal e tudo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Somas os dois números, bit de sinal incluído, não se deixa de parte.

Se somares dois números positivos e o bit da esquerda for 1, deu overflow.

Se somares dois negativos e o bit da esquerda for 0, deu overflow.

Por acaso ate tenha esta "regra" nos meus apontamentos, só que esqueci-me dela.

A vantagem do complemento para dois é que te podes limitar a somar os números sem te preocupares se são negativos ou positivos, pois somas bit de sinal e tudo.

Ou seja, no fim, vou ter o resultado em complemento para dois e se não der overflow faço o contrário de passar um número em binário (com sinal) para complemento para 2 para saber o valor real dele. Certo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yep, ou então como eu disse, em complemento para 2, o 1º bit significa -128, ou seja, basta veres o valor dos últimos 7 bits e depois tirares -128 ou não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yep, ou então como eu disse, em complemento para 2, o 1º bit significa -128, ou seja, basta veres o valor dos últimos 7 bits e depois tirares -128 ou não.

Prefiro como o Warrior disse, o que tu disseste é muito confuso para o meu mini cérebro :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal, já percebi os 3 primeiros mas estou com dificuldade na alínea d)

-100-27 = -127

Representação binária sem sinal:

100 = 0110 0100

27 = 0001 1011

Representação em complemento para 2:

-100 = 1001 1100

-27 = 1110 0101

1001 1100

1110 0101

-----------------

1000 0001 (-1) ??

Que fiz mal?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1000 0001 (-1) ??

Que fiz mal?

Esta última conversão... 1000 0001 é -2^7+1=-128+1=-127 e não -1.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas é isso que eu não percebo... Tipo, passei o 100 e o 27 para complemento para 2, representado-os assim na sua forma negativa. E depois somei. O resultado nao é um número binário em complemento para 2 também?

Se sim:

O primeiro bit diz que o número é negativo, depois é tudo zeros até ao último bit, o que lhe dá o valor 1. Ou seja -1.

Se não:

O primeiro bit não representa 128? e depois o último 1, o que daria 129?

Mas o resultado é -127, portanto não estou a perceber como é que estás a fazer isso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas é isso que eu não percebo... Tipo, passei o 100 e o 27 para complemento para 2, representado-os assim na sua forma negativa. E depois somei. O resultado nao é um número binário em complemento para 2 também?

Se sim:

O primeiro bit diz que o número é negativo, depois é tudo zeros até ao último bit, o que lhe dá o valor 1. Ou seja -1.

Se não:

O primeiro bit não representa 128? e depois o último 1, o que daria 129?

Mas o resultado é -127, portanto não estou a perceber como é que estás a fazer isso...

Olha bem para a forma como convertes um número binário para complemento para 2...

Se 1000 0001 é -1, então -100 devia ser 1110 0100 e não 1001 1100 (esqueceste-te da inversão dos bits)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Converti pela regra normal como tu fizeste no exercício c). Número positivo » Inverter todos os bits » Somar 1 (tudo isto já com o bit do sinal).

Estas a dizer que tenho de passar o número 1000 0001 para complemento para 2? Ou noutras palavras, aplicar a este número a mesma técnica que se usa para passar um número para complemento para 2? Porque no exercício a) e c), não faço essa conversão/inversão e o resultado está correcto...

Mas é isso que eu não percebo porquê que é necessário.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Yep, ou então como eu disse, em complemento para 2, o 1º bit significa -128, ou seja, basta veres o valor dos últimos 7 bits e depois tirares -128 ou não.

A resposta às tuas dúvidas está aqui Nazgulled... Quando representas em complemento para 2, o primeiro bit significa -128 e o resto interpretas normalmente (se forem 8 bits, obviamente). Não tem nada que saber, a representação é igual a um binário normal mas o primeiro bit é -128 em vez de 128...

Exemplo:

1000 0001

Vamos separar o primeiro bit dos restantes:

1    0000001

restantes 7 bits, intepretamos normalmente: 0000001, ok 1

1º bit, se for 0 não faz nada, se for 1 subtraimos 2^n, neste caso n=8, subtraimos 128.

Resultado final 1 -128 = -127

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas eu não percebo porquê que é assim. Quando sempre fui ensinado ah e tal o bit mais significativo é o do sinal, se for 1 é negativo. E agora dizes-me que é -128 (neste caso). Isto confunde-me...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando convertes um número negativo para complemento para dois, o que fazes é passar para binário, inverter os bits e somar 1. Para saberes quanto vale 1000 0001 em decimal, tens que fazer o processo inverso, subtrais 1 (1000 0000), invertes os bits (0111 1111), e convertes para decimal (127). Como isto é o processo para números negativos, temos o -127.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas eu não percebo porquê que é assim. Quando sempre fui ensinado ah e tal o bit mais significativo é o do sinal, se for 1 é negativo. E agora dizes-me que é -128 (neste caso). Isto confunde-me...

:/ ... A questão não é porque é que é assim. É assim e pronto. A representação em complemento para 2 é exactamente igual com a excepção de que o bit de sinal representa valor negativo em vez de positivo (neste caso, -128 em vez de 128). Tal facto permite-nos representar números entre -128 e 127, ou no caso geral entre -2^n e 2^n + 1. É apenas uma forma lógica de representar inteiros com sinal...

A forma como passas de e para complemento para 2 vem do facto de o 1º bit ter este significado, mais nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora