Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

Nazgulled

Aritmética com números binários

Mensagens Recomendadas

Nazgulled    8
Nazgulled

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrosorio    5
pedrosorio

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

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...).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

(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).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrosorio    5
pedrosorio

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

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. :/

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Warrior    68
Warrior

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrosorio    5
pedrosorio

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrosorio    5
pedrosorio

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrosorio    5
pedrosorio

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.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade