Vamos continuar falando de sistemas numéricos? Não é nada complicado! Até aqui vimos os vários sistemas numéricos existentes. Você se lembra de todos? Vou te ajudar: decimal, binário, hexadecimal e octal. Eles são muito importantes, porque por meio deles é possível codificar uma informação para a máquina processar. A máquina ou computador realiza continuamente cálculos, comparações e decisões. Vamos, então, aprender que cálculo ela realiza para converter, por exemplo, de uma base binária para uma base hexadecimal? Ou vice-versa?
A matemática é inimiga de muita gente, não é verdade? Mas não se assuste, pois embora estejamos falando de números e cálculos já há algumas lições, o que continuaremos vendo é bastante simples e a ideia é de que você apenas compreenda como internamente a máquina funciona. Mais à frente, isso vai ser importante, principalmente para criação de soluções otimizadas e que talvez tenham que ter uma aderência a um bom uso de memória e de explorar bem os requisitos de hardware.
Aliás, essas questões têm sido um desafio. A cada dia, mais dados são gerados, mais segurança é necessária e, portanto, mais recursos computacionais são necessários. Isso nos leva a querer estratégias de otimização de recursos para que estes possam servir mais tempo. Imagine que a cada vez que se precisa realizar uma atualização de recursos é mais dinheiro investido. Isso com certeza vai fazer com que os profissionais de computação sejam cada dia mais exigentes em escolher boas tecnologias que possam utilizar bem os recursos e, dessa maneira, dar sobrevida ao seu uso.
Talvez uma de suas atividades favoritas é navegar na Internet. No passado, geralmente, as pessoas se conectavam à internet em uma determinada hora do dia. Hoje, todos nós estamos conectados o dia todo. Mas você já parou para pensar em como a “mágica” acontece? Como você consegue acessar o conteúdo de uma rede social ou de um site?
Isso somente é possível graças ao desenvolvimento de um protocolo de comunicação chamado TCP/IP (Transmission Control Protocol ou Protocolo de Controle de Transmissão/Internet Protocol ou Protocolo de Internet). Ele foi criado nos anos 70 pelo Departamento de Defesa dos Estados Unidos. Graças a isso, você não precisa pagar por ele. Se ele fosse criado por uma empresa, fatalmente teríamos que desembolsar algum dinheiro para isso. Contudo, isso também trouxe uma desvantagem, pois o Departamento de Defesa imaginava que ele seria apenas para uso interno, pois seu primeiro objetivo era interconectar os computadores de várias bases militares. Em vista disso, não houve muita preocupação com os aspectos de segurança do protocolo. E, isso, hoje em dia, traz alguns problemas. O uso do protocolo se massificou e até hoje utilizamos em todas as redes de computadores, basicamente.
São estruturas criadas com objetivo de realizar a troca de dados entre vários dispositivos que podem estar ao lado um do outro ou mesmo do outro lado do mundo. Por meio de um padrão que é estabelecido pelo protocolo de comunicação, um dispositivo sabe de onde será enviado os dados, como e quando recebê-lo. No caso do TCP/IP, são vários protocolos utilizados nas comunicações de computação. Dessa maneira, cada um deles tem uma função, relacionada a um recurso de rede. Entre estes, podemos citar alguns que tenho certeza que você já deve ter ouvido falar: UDP (User Datagram Protocol), RIP (Routing Information Protocol), Telnet, SMTP (Simple Mail Transfer Protocol), DNS (Domain Name System).
Agora, é hora de começarmos a entender em que os sistemas numéricos estão envolvidos nos protocolos de comunicação. Cada pacote que é transmitido ou recebido é na verdade composto por um fluxo de bytes. Eles, portanto, precisam estabelecer uma comunicação e a formação dos bytes possuem um significado de acordo com o estabelecido por aquele protocolo (que nada mais é do que várias regras existentes que definem o formato dos pacotes e como serão utilizados). Na maioria dos casos, eles são formados por um corpo (parte de arquivo ou mesmo outros pacotes) e um cabeçalho (endereços de onde a informação veio e para onde vai, tamanho do pacote e a decodificação). Por exemplo, em uma rede local, que seria uma Ethernet, o protocolo seria composto por:
6 bytes - endereço de destino
6 bytes - endereço de origem
2 bytes - tipo
46 a 1500 bytes - dados
Todo dispositivo conectado a uma rede, portanto, está realizando uma série de comunicações. Por meio de enlaces, ele pode aceitar a conexão com outros dispositivos, o que faz com que todos os dados necessitem de um endereço de destino (assim como uma correspondência que será enviada pelo correio que necessita do CEP). Esses são endereços MAC (endereços físicos). Você sabe como consultar o MAC ADDRESS da sua máquina? Se você der um google e inserir a pergunta MAC ADDRESS do celular ou do computador, você vai ter as orientações para isso. É bem simples! Eles, em geral, são atribuídos pelo próprio fabricante do dispositivo.
Voltemos ao exemplo da rede Ethernet, que atribui um endereço para todo dispositivo da sua rede. Como esse endereçamento é feito? Por meio de seis bytes gravados em números hexadecimais. Os bytes são separados por dois pontos: 08:00:20:0A:8C:6D. Esses endereços são atribuídos pela IEEE (Institute of Eletrical and Eletronics Engineers) e são exclusivos em todos os dispositivos Ethernet. Percebeu a importância dos sistemas de numeração? Eles são fundamentais para organizar os dados, transmitir e operacionalizar o uso dos dispositivos e das comunicações entre eles.
Guimarães e Lages (2005) nos ajudam a entender a importância da conversão de bases. Isso significa que vamos passar a representação de um número que está em uma base numérica para outra base. Conforme vimos na lição anterior, as principais bases são: Decimal, Binária, Hexadecimal e Octal, as quais ratificamos na Tabela 1 e estudaremos suas conversões adiante. Isso tem sua relevância quando pensamos em construir aplicações que necessitarão de hardware, por exemplo.
Para convertermos de binário para hexadecimal, podemos separar o número binário em grupos de 4 dígitos e substituirmos cada grupo pelo dígito correspondente. Exemplo:
01010111 para Hexadecimal
Separados em grupos de quatro dígitos temos:
0101 = 5
0111 = 7
Em hexadecimal = 57
Então, 01010111 em base 2 é o mesmo que 57 em base 16.
Para conversão de hexadecimal para binário, podemos substituir cada dígito hexadecimal pelo número binário de 4 dígitos correspondente. Por exemplo:
9D8F para Binário
Separando cada dígito temos:
9 = 1001
D = 1101
8 = 1000
F = 1111
Em binário = 1001110110001111
Então, 9D8F em base 16 é 1001110110001111 em base 2.
A conversão de octal para binário é feita para cada dígito no equivalente binário de 3 bits. Por exemplo:
472 em octal
4 = 100
7 = 111
2 = 010
Em binário = 100111010
Então, 472 em base 8 é 100111010 em binário.
A conversão de binário para octal é feita por meio de cada grupo de 3 bits convertidos no dígito do octal que equivale. Por exemplo:
10011101 em binário
101 = 5
011 = 3
010 = 2
Em octal = 235
Como você percebeu, o nosso número binário não era um múltiplo de 3, pois ele era um byte, ou seja, possui 8 dígitos. Nesses casos, podem ser adicionados até 2 0s à esquerda do número. Por isso, no último grupo de bits, tivemos a adição de um zero e ficamos com 010.
Creio que essa conversão que já foi falada em uma lição anterior está bem aprendida! Entretanto, como estamos falando sobre isso, vale a pena relembrarmos aqui. A conversão de números binário para decimal se dá por meio das posições que os números 1 ou 0 estão. Veja o exemplo abaixo por meio de um byte, como é simples:
11010110 em binário
O primeiro número 0 mais à direita está na posição 0 da base 2, portanto:
0 multiplicado por 2⁰ = 0
1 multiplicado por 2¹ = 2
1 multiplicado por 2² = 4
0 multiplicado por 2³ = 0
1 multiplicado por 2⁴ = 16
0 multiplicado por 2⁵ = 0
1 multiplicado por 2⁶ = 64
1 multiplicado por 2⁷ = 128
A seguir, basta realizarmos a soma e daí teremos o equivalente em decimal:
11010110 em binário equivale a 214 em decimal.
Para fazer a conversão de decimal para binário, basta utilizar as divisões sucessivas. É assim: você divide o número em decimal por 2 e o resto da divisão será um dígito que comporá o seu equivalente binário. O resultado ou o que está no quociente da divisão é dividido por 2 de novo. Repete-se até que o resultado da divisão seja zero. Veja o exemplo com o número 25 em decimal.
25 em decimal
25/2 - na primeira iteração, o quociente é 12 e o resto é 1.
12/2 - na segunda iteração o quociente é 6 e o resto é 0.
6/2 - na terceira iteração o quociente é 3 e o resto é 0.
3/2 - na quarta iteração o quociente é 1 e o resto é 1.
1/ 2 - na quinta iteração o quociente é 0 e o resto é 1.
Assim, 25 em decimal equivale a 11001 em binário.
Da mesma maneira que é feita a conversão de decimal para binário, a conversão para hexadecimal é feita utilizando as divisões sucessivas. Entretanto, nesse caso, as divisões dos números inteiros são feitas por 16. Vamos utilizar o mesmo exemplo anterior, o número 25 em decimal.
25 em decimal
25/16 - na primeira iteração, o quociente é 1 e o resto é 9.
1/16 - na segunda iteração, o quociente é 0 e o resto é 1.
Assim, 25 em decimal equivale a 19 em hexadecimal.
A conversão de hexadecimal para decimal é igual ao que fazemos com o binário, porém vamos considerar a potência de 16. Veja o exemplo:
40 em hexadecimal
4 multiplicado por 16^1 = 64
0 multiplicado por 16^0 = 0
Assim, 40 em hexadecimal equivale a 64 em decimal.
A conversão de números da base octal para a base decimal é igual à conversão de binário para decimal. Veja o exemplo abaixo:
372 em octal
3 multiplicado por 8^2 = 192
7 multiplicado por 8^1 = 56
2 multiplicado por 8^0 = 2
Assim, 372 em octal equivale a 250 em decimal.
Da mesma maneira, realizamos também a conversão inversa. Veja o exemplo:
246 em decimal
246/8 - na primeira iteração, o quociente é 30 e o resto é 6.
30/8 - na segunda iteração, o quociente é 3 e o resto é 6.
Assim, 246 em decimal equivale a 366 em octal. O resultado é lido da direita para esquerda a partir do último quociente.
Com certeza, em seu curso você aprenderá a criar um programa de computador. Em geral, utilizamos uma linguagem de programação que tenta se aproximar da nossa linguagem humana. Isso facilita o nosso trabalho, pois imagina se tivéssemos que passar instruções e comandos para os computadores por meio de números binários e hexadecimais? Seria bastante complicado! Por isso, as linguagens de programação geram um código fonte que está escrito em uma linguagem que chamamos de Linguagem de Alto Nível (próxima da humana). A ideia é que esse código fonte possa ser executado em qualquer dispositivo, independentemente de máquina.
No entanto, há outro tipo de linguagem, que se chama Linguagem de Baixo Nível ou de Montagem. Essas são utilizadas principalmente quando se precisa de uma aplicação mais direta em relação ao acesso a dispositivos de memória, transmissão por meio de um protocolo de comunicação, posição na memória. E, ainda, temos a Linguagem de Máquina que é executada pelo computador e que precisa converter toda a linguagem que vimos acima em binário, ou seja, em zeros e uns.
GUIMARÃES, A. M.; LAGES, N. A. Introdução à Ciência da Computação. Rio de Janeiro: LTC, 2005.