# Representação de números
# Operandos com sinal
# Sinal e módulo
- O sinal é o bit mais significativo .
- O módulo são os restantes bits .
- A representação do número é realizada complementado o bit de sinal.
- Existem dois zeros e .
# Complemento para um
- O sinal é o bit mais significativo .
- Se for posito, então oss restantes bits representam o módulo.
- Se for negativo, os restantes bits representam o complemento do módulo.
- A representação do número é realizada complementando todos os bits do número, isto é:
- Existem dois zeros e .
# Complemento para dois
- O sinal é o bit mais significativo .
- Se for posito, então oss restantes bits representam o módulo.
- Se for negativo, os restantes bits representam o complemento do módulo mais 1.
- A representação é realizada complementando todos os bits do número a que se soma um valor, isto é
- Só existe um zero mas a gama dos números negativos é maior que a gama dos números positivos.
# Tipos de Operandos
- Byte 8 bits (1 byte);
- Half Word 16 bits (2 bytes);
- Word 32 bits (4 bytes);
- Double Word 64 bits (8 bytes);
- Quad Word 128 bits (16 bytes);
# Operações Aritméticas
# Soma/subtração
Geralmente os números inteiros com sinal são representados em formato de complemento para dois, visto que facilita a implementação do somador.
- Flags
- Carry (C) = ;
- Zero (Z): Z = 1 se o resultado for zero, 0 se o resultado não for 0;
- Negative (N) = ;
- Overflow (V) =
# Multiplicação
O produto de dois números com e bits, respetivamente, resulta num número contido em bits. .
Para realizar um produto em números com sinal, primeiro deve-se estender ambos os operando de forma a prefazer o número de bits usado no resultado. A operação da multiplicação de números, no pior dos casos, usa uma cadeia de somadores igual ao número de bits do resultado.
# Divisão
A operação da divisão é bastante mais complexa, envolvendo operações encadeadas. Embora existam vários algoritmos para a implementação eficiente da divisão, como se verá mais à frente, o tempo de cálculo é sempre bastante superior ao de uma soma ou a de uma multiplicação. Assim, é uma boa prática da programação, sempre que possível, evitar a utilização da operação da divisão. Por exemplo, se o divisor for uma potência de dois, pode e deve-se fazer um shift.
# Representação de números com virgula
# Virgula Fixa
- A virgula está numa posição fixa, mas apenas o programador sabe onde está. Para realizar uma operação, é necessário efetuar todas as normalizações e desnormalizações à mão. Utiliza-se frequentemente a nomenclatura da Texas Instruments, a qual assume números em complemento para dois.
Por exemplo:
Formato Qn bits para a parte fracionária;
Formato Qm.n bits para a parte inteira, bits para a parte fracionária
Por exemplo
O número está representado no formato ou
O formato permite representar número na gama [-2^5, 2^5 -2^-2].
Na prática, a representação indica que o operando pode ser representado como inteiro à parte de um fator de escala . Para realizar operações em virgula fixa é necessário ter em consideração os fatores de escala de cada um dos operandos, normalizandos-os (converter para o mesmo fator de escala) antes de efetuar uma operação.
# Soma/subtração de operandos com o formato e
- Verificar qual dos números tem menor número de bits na parte inteira.
- Ao operando escolhido em 1) fazer um arithmetic shift right (complemento para 2) do módulo da diferença
- Somar ou subtrair os operandos
Por exemplo:
110101.10 + 1100.1110 (110101.10 sl 2) + 1100.1110 0101.1000 + 1100.1110 10010.0110
NOTA:
Formato Q2
Formato Q4
Esta forma maximiza a precisão, mas pode levar a overflow
Também existe forma de minimizar a existência de overflows, mas esta acaba por também minimizar a precisão
110101.10 + 1100.1110 110101.10 + (1100.1110 asr 2) 0101.10 + 1100.11 10010.01
NOTA:
Formato Q2
Formato Q4
# Produto de operandos com formato e
- Não é necessário a normalização
- O formato está no formato
Por exemplo:
110101.10 x 1100.1110 = (11010110 x 2^-2) x (11001110 x 2^-4) =
11010110 x (11001110 x 2^-6) (2^-2 + 2^-4 = 2^-6) =
(000 1000 0011 0100) x 2^-6=
0000 100000.110100
# Virgula Flutuante
Suporta números em que a vírgula não está fixa tal como é para os inteiros. Em C, usamos o nome de float para definir estes números.
Semelhante à notação científica, os números estão representados como um único dígito diferente de 0 à esquerda da vírgula binária.
- Norma IEEE 754
- Base b, 2 ou 10;
- Mantissa (m), a qual é sempre representada no formato ;
- Expoente (e);
- Sinal (s);
- Representa o número:
# Fração
Como a mantissa começa com , não precisamos de escrever o no campo de fração. Assim, existe sempre um 1 "escondido" que não é representado na fração.
# Expoente
O expoente é representado com um offset: 127
Por exemplo
X = 0 01111101 0110 0000 0000 0000 000
sinal (s) = 0 = +
Expoente (e) = 01111101 = 125; 125-127 = -2
Mantissa (m) = 0110 ...
IEEE 754 = + 1, 011 x2^-2