Curso de Pascal
Sistemas de Numeração
Você está em: MarMSX >> Cursos >> Pascal
Comumente nos deparamos com as expressões: decimal, hexadecimal, binário e octal. Afinal, o que isso vem a ser?
O sistema de numeração que utilizamos é o sistema decimal, composto por 10 dígitos: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9.
Os demais números são compostos pela combinação dos símbolos decimais elementares, como por exemplo 1765.
Os números são divididos em casas decimais. Ex:
Casa decimal |
Milhar |
Centena |
Dezena |
Unidade |
Número |
1 |
7 |
6 |
5 |
Contamos os números em seqüência, de 0 a 9. Quando o valor máximo 9 é atingido e necessitamos aumentar em uma unidade o valor do número, aumentamos o valor da próxima casa decimal à esquerda e retornamos ao valor inicial na casa corrente ou o 0. Ex:
du -> Casa decimal
09
+ 01
--
10
De forma análoga, quando diminuimos de uma unidade uma casa decimal que contém o valor 0 (mínimo), diminuimos em uma unidade a casa decimal imediatamente à sua direita e a casa atual vai para o valor máximo 9. Ex:
du -> Casa decimal
10
- 01
--
09
Os sistemas de numeração apresentados, se diferem quanto à quantidade de dígitos utilizados. Assim temos:
Sistema |
No. Dígitos |
Símbolos |
Binário |
2 |
0, 1 |
Octal |
8 |
0, 1, 2, 3, 4, 5, 6, 7 |
Decimal |
10 |
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 |
Hexadecimal |
16 |
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F |
Todo sistema de numeração irá respeitar as regras das casas decimais apresentados. Assim, por exemplo, quando o sistema binário atingir o número máximo 1, irá incremetar a casa imediatamente à direita e retornar ao valor zero na casa corrente.
A seguir um exemplo de numeração completa de 0 a 16 em decimal e os valores correspondentes dos outros sistemas:
Sistema |
Decimal |
Binário |
Hexadecimal |
Octal |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
2 |
10 |
2 |
2 |
3 |
11 |
3 |
3 |
4 |
100 |
4 |
4 |
5 |
101 |
5 |
5 |
6 |
110 |
6 |
6 |
7 |
111 |
7 |
7 |
8 |
1000 |
8 |
10 |
9 |
1001 |
9 |
11 |
10 |
1010 |
A |
12 |
11 |
1011 |
B |
13 |
12 |
1100 |
C |
14 |
13 |
1101 |
D |
15 |
14 |
1110 |
E |
16 |
15 |
1111 |
F |
17 |
16 |
10000 |
10 |
20 |
... |
... |
... |
... |
Obs: os valores que atingiram o máximo permitido para cada casa de unidade
em seu respectivo sistema é assinalado em vermelho.
Por que utilizar outros sistemas de numeração?
Primeiro, porque o sistema binário é largamente utilizado em eletrônica e computação como a representação dos estados de ligado (valor 1) e desligado (valor 0).
Segundo, porque o sistema hexadecimal é visualmente mais elegante e prático do que o decimal para a análise de dados. Note, pela tabela de correspondência entre sistemas acima, que os sistemas binários e hexadecimal, por serem múltiplos, possuem uma correlação perfeita para fazer a conversão entre sistemas diretamente. O mesmo não pode ser aplicado entre os outros sistemas e o sistema decimal.
Seja o endereço de memória 54672 (em decimal), qual o seu correspondente em binário? Tem que fazer conta ...
Entretanto, se esse endereço estivesse no sistema hexadecimal (valor D590), bastaria consultar a tabela de conversões e preencher os valores. Assim, teríamos:
D 5 9 0 -> Hexadecimal
1101 0101 1001 0000 -> Binário
Obs: Temos que preencher sempre com 4 dígitos a conversão de tabela entre os sistemas hexadecimal e binário.
CONVERTENDO SISTEMAS DE NUMERAÇÃO EM PASCAL
O Pascal do MSX não possui funções nativas de conversão entre sistemas de numeração. O máximo que oferece é aceitar um número em hexadecimal, utilizando-se o símbolo dólar($) antes do número. Ex:
num := $A0;
A seguir, serão apresentados algumas rotinas de conversão entre sistemas.
Rotina 1: conversão entre qualquer sistema até para decimal.
function potencia(num, n : integer) : longint;
begin
potencia := 1;
while (n > 0) do
begin
potencia := potencia * num;
n := n - 1;
end;
end;
function sistema_para_decimal(num, base : integer) : integer;
var i : integer;
begin
sistema_para_decimal := 0;
i := 0;
while num > 0 do
begin
sistema_para_decimal := sistema_para_decimal + potencia(base, i) * (num mod 10);
num := num div 10;
i := i + 1;
end;
end;
begin
writeln('Binario 100 para decimal: ', sistema_para_decimal(100, 2));
writeln('Octal 11 para decimal: ', sistema_para_decimal(11, 8));
writeln('Sistema (base 4) 12 para decimal: ', sistema_para_decimal(12, 4));
end.
Saída:
Binario 100 para decimal: 4
Octal 11 para decimal: 9
Sistema (base 4) 12 para decimal: 6
Obs: Base é quantidade de algarismos de um sistema de numeração. Assim, decimal é base 10, octal é base 8, binário é base 2 e hexadecimal é base 16.
Rotina 2: conversão entre os sistemas hexadecimal, octal e binário para decimal. Agora, a rotina de conversão trabalha com números em formato de string.
function potencia(num, n : integer) : longint;
begin
potencia := 1;
while (n > 0) do
begin
potencia := potencia * num;
n := n - 1;
end;
end;
function num_hex_para_dec(c : char) : integer;
var cod_char : integer;
begin
cod_char := ord(c);
case cod_char of
48..57 : num_hex_para_dec := cod_char - 48;
65..70 : num_hex_para_dec := cod_char - 55;
97..102 : num_hex_para_dec := cod_char - 87;
else
num_hex_para_dec := 0;
end;
end;
function sistema_para_decimal(num_str : string; base : integer) : integer;
var i, num, num_str_size : integer;
begin
sistema_para_decimal := 0;
num_str_size := length(num_str);
for i:=num_str_size downto 1 do
begin
num := num_hex_para_dec(num_str[i]);
sistema_para_decimal := sistema_para_decimal + potencia(base, num_str_size - i) * num;
num := num div 10;
end;
end;
function num_para_string(num : longint) : string;
begin
num_para_string := '';
while num > 0 do
begin
num_para_string := chr((num mod 10) + 48) + num_para_string;
num := num div 10;
end;
end;
function bin2dec(num : longint) : integer;
begin
bin2dec := sistema_para_decimal(num_para_string(num), 2);
end;
function oct2dec(num : longint) : integer;
begin
oct2dec := sistema_para_decimal(num_para_string(num), 8);
end;
function hex2dec(num : string) : integer;
begin
hex2dec := sistema_para_decimal(num, 16);
end;
begin
writeln('Hexadecimal 2B para decimal: ', hex2dec('2B'));
writeln('Octal 20 para decimal: ', oct2dec(20));
writeln('Binario 1100 para decimal: ', bin2dec(1100));
end.
Saída:
Hexadecimal 2B para decimal: 43
Octal 20 para decimal: 16
Binario 1100 para decimal: 12
Rotina 3: converte um número decimal para qualquer sistema até hexadecimal.
function dec_para_num_hex(num : integer) : char;
begin
case num of
0..9 : dec_para_num_hex := chr(num + 48);
10..15 : dec_para_num_hex := chr(num + 55);
else
dec_para_num_hex := chr(0);
end;
end;
function decimal_para_sistema(num, base : integer) : string;
begin
decimal_para_sistema := '';
while num > 0 do
begin
decimal_para_sistema := dec_para_num_hex(num mod base) + decimal_para_sistema;
num := num div base;
end;
end;
begin
writeln('Decimal 43 para hexadecimal: ', decimal_para_sistema(43, 16));
writeln('Decimal 15 para binario: ', decimal_para_sistema(15, 2));
end.
Saída:
Decimal 43 para hexadecimal: 2B
Decimal 15 para binario: 1111