Operações aritméticas com números binários sinalizados

Introdução

editar

O sistema binário é uma representação numérica de base dois, em que toda quantidade é representada somente por dois símbolos, ou dois números, sendo eles 0(zero) e 1(um). Quase todos os computadores digitais utilizam a numeração binária como forma de leitura de comandos, devido a este fator o sistema de numeração se tornou muito importante. Em computação a abordagem é simples: 0 (zero), significa ausência de energia ; 1(um), significa energia. A base utilizada por nós, seres humanos é a base 10, de forma que as quantidades numéricas são representadas por 10 dígitos, qualquer valor representado na base 10, pode ser transformado em um valor na base 2, sendo a única diferença no valor é seu número de dígitos que será aumentado. Um dos problemas na interpretação desses números pelos computadores é a diferenciação entre números positivos e negativos e as consequências que tais dificuldades de sinalização trariam para as operações matemáticas (soma,subtração,divisão,multiplicação), seriam críticas logo para resolver os problemas foram criadas algumas abordagens para a diferenciação entre os números (positivos e negativos), como sinal e magnitude, complemento de 1 e complemento de 2.

Operações matemáticas

editar

Adição

editar

Regras básicas para adição de binários

editar

0 + 0 = 0

0 + 1 = 1

1 + 0 = 1

1 + 1 = 0 (Carry = 1) Ocorre o vai 1 (transporte de 1)

Exemplo

editar

¹ 11010 + 10011 ------- 101101

'Obs: Lembre-se, você sabe que como se trata de adição de binários 1 + 1 é igual a 0 (Carry 1), e não 2 como visto até o momento.

#include <iostream>

using namespace std;

bool binsum(bool bita, bool bitb, bool *carry)

{

if(bita && bitb)

{

cout <<"1 + 1 = ";

*carry = true;

return false;

}

else if(bita == false && bitb == false)

{

cout <<"0 + 0 = ";

*carry = false;

return false;

}

else if(bita || bitb)

{

cout <<"0 + 1 = ";

*carry = false;

return true;

}

*carry = false;

return false;

}

void codifica(bool val)

{

if(val)

cout << 1 << endl;

else

cout << 0 << endl;

}

int main()

{

bool car = false;

codifica(binsum(true, true, &car));

cout << car << endl;

car = false;

codifica(binsum(false, false, &car));

cout << car << endl;

car = false;

codifica(binsum(true, false, &car));

cout << car << endl;

car = false;

codifica(binsum(false, true, &car));

cout << car << endl;

car = true;

codifica(binsum(true, true, &car));

cout << car << endl;

car = true;

codifica(binsum(false, false, &car));

cout << car << endl;

car = true;

codifica(binsum(true, false, &car));

cout << car << endl;

car = true;

codifica(binsum(false, true, &car));

cout << car << endl;

car = true;

return 0;

}

Saída

1 + 1 = 0

1 //carry

0 + 0 = 0

0

0 + 1 = 1

0

0 + 1 = 1

0

1 + 1 = 0

1

0 + 0 = 0

0

0 + 1 = 1

0

0 + 1 = 1

0

Subtração

editar

Regras básicas para subtração de binários

editar

0 - 0 = 0

1 - 1 = 0

1 - 0 = 1

0 - 1 = 1 (o empréstimo igual a 1)

Exemplo

editar

11010 - 10011 Exemplo

' 1 1101 x 101 x 111


------

 11                 1101   
00+                1101+    

11+ 1101+


--------

1111 1011011

Divisão

editar

------ 011

Isto é a coisa mais confusa, tentem explicar isto melhor wikipédia!

Multiplicação

editar

Regras básicas para multiplicação de binários

editar

0 * 0 = 0

0 * 1 = 0

1 * 0 = 0

1 * 1 = 1


Para esta operação aritmética não utilizamos nenhuma regra especifica de números binários.
Ou seja utilizaremos as mesmas regras básicas da divisão decimal.
Outra forma, seria subtrair-se o dividendo com o divisor (dividendo-divisor)até que o resto seja menor que o divisor. E a cada subtração deve-se somar 1 (1 em binário) ao quociente que antes da primeira subtração é zero.

Exemplo

editar

1ªForma:

10100 | 101 ----- - 101 100 ----- 000

2ªForma:


Sinal e Magnitude

editar

Na base 10 (podendo utilizar em outras bases) a representação de um número positivo é feita apresentando somente o número, ou o número com um sinal(+), a esquerda, já os negativos possuem um sinal(-) a esquerda. Começando assim o problema como adicionar um símbolo a um número binário se um computador "entende" somente 1 e 0, assim a forma de representação de sinal e magnitude nos diz que um número binário de 8 dígitos ou seja 1 Byte(8 bits) o primeiro dígito da esquerda para a direita deve ser considerado o sinal, sendo 0 sinal positivo e 1 o sinal é negativo, de forma que se um número começar com o dígito 0 ele é positivo, e ao contrário, negativo (começando com 1). Os outros sete digitos representam a magnitude, ou o valor absoluto . Um dos problemas apresentados é que o zero pode ser representado de duas maneira, 00000000(+0) ou 10000000(-0), além disso para efetuar operações é sempre necessário observar o sinal.


Complemento de 1

editar

Outra maneira de representar números binários negativos[1], consiste em inverter todos os bits, ou seja onde tem 0 ele é substituído por 1 e onde existe 1 é substituído por 0. Os números positivos permanecem inalterados, sendo o primeiro dígito o 0 e nos números negativos o primeiro dígito 1. Podendo representar o zero, 00000000 e 11111111.


Complemento de 2

editar

Os números negativos nessa abordagem são representados primeiramente aplicando-lhes a regra do complemento de 1, ou seja inverte-se todos os elementos 0 por 1 e 1 por 0 e em seguida soma 1 ao resultado. O principal objetivo do complemento de 2 é trazer uma representação única ao número zero e possibilitar a soma de números positivos e negativos, sem se preocupar com os sinais, pois nessa abordagem a soma de números positivos e negativos pode ser feita normalmente como a soma de dois números positivos. Considerando que todos os números estão representados em complemento de 2, a soma de dois números pode ser feita independente do sinal de cada um e ainda tem como vantagem uma única representação para o zero.


Referências

editar

SISTEMAS DIGITAIS - FUNDAMENTOS E APLICAÇOES, por Thomas Floyd 9ª Edição

  1. [S.l.: s.n.]  |nome1= sem |sobrenome1= em Authors list (ajuda); Em falta ou vazio |título= (ajuda)