O que é o sistema hexadecimal?

13

O que é o sistema hexadecimal e por que é tão usado na computação? Eu sei que os computadores usam 0s e 1s para armazenar dados, então como usamos hexadecimal?

Justin Krejcha
fonte
13
Se não estiver fora de tópico, como uma pergunta tão básica não é duplicada 5 anos após o início do Superusuário?
Peter Mortensen
3
@PeterMortensen Ainda mais estranho, ainda não foi solicitado em nenhum dos sites irmãos, pelo menos, não que eu possa encontrar.
Nzall #
9
Pode ser que não precisam ser feitas como a Wikipedia tem uma resposta muito boa: en.wikipedia.org/wiki/Hexadecimal
Piers Myers
4
Por que tantos votos positivos?
Vi.

Respostas:

31

Hexadecimal é um sistema numérico muito comum na computação. Você já deve ter ouvido falar de binário antes, que possui apenas 1s e 0s.

Os seres humanos usam principalmente o sistema decimal (base 10), no qual temos 10 números:

0, 1, 2, 3, 4, 5, 6, 7, 8 e 9

No entanto, os computadores não operam usando o sistema decimal. Eles têm um estado binário (algo é verdadeiro ou falso) e, portanto, opera na base 2 (os números binários geralmente são prefixados 0b), com os únicos números sendo 0 e 1.

Nos dias anteriores, octal (ou base 8) era usado. Foi bom porque "10" na base 8 era "0b1000" em binário (10 em decimal é 1010 em binário). Octal é geralmente prefixado "0o" ao escrever números (mas é prefixado apenas '0' na maioria das linguagens de programação). Chama-se base 8 porque temos oito números.

O Octal ainda está sendo usado hoje, principalmente ao definir permissões no Unix e Linux

Com o passar do tempo, precisávamos de uma maneira mais fácil de representar números maiores, pois o poder e o espaço da computação estavam aumentando rapidamente. Tornou-se o padrão usar hexadecimal , ou base 16, porque 16, como 8, é uma potência de 2, o que facilita a conversão de dígito por dígito (veja este comentário .Por causa de 16 números, as letras foram usadas para os outros números.Também, hex é geralmente prefixado com 0x.

Os números hexadecimais também são úteis, pois um número hexadecimal é de 4 bits (1 número octal pode representar 2) e, portanto, dois números em um byte. Na maioria dos editores hexadecimais , é assim que um byte é representado.

Contando

Na base 10, temos 10 numerais. Depois das 9, o que fazemos? Estamos sem numerais. Criamos um local "dezenas" à esquerda do número original, que seja 1 e o mais à direita se torne 0. O mesmo acontece com o hexadecimal:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, etc

Até chegarmos a 0x1F e, em seguida, o processo se repete até 0xFF (255 em decimal) e, em seguida, obtemos 0x100. Mais informações sobre a contagem podem ser encontradas aqui .

Aqui está um gráfico mostrando as conversões entre decimal, hexadecimal, octal e binário: Gráfico de conversão hexadecimal

Justin Krejcha
fonte
21
O principal benefício é que, como 16 é uma potência de 2, você pode fazer conversões dígito por dígito.
Trig
2
Observe que muitos idiomas usam o 0prefixo e não os 0onúmeros octais.
usar o seguinte comando
2
Sua observação sobre 16 sendo múltiplo de 2 é incorretamente copiada do comentário do TRiG. Ser múltiplo não é a relação relevante.
Ryan Reich
2
@ justcool393, vale a pena mencionar que o nome para o que você chama de "base 10" é na verdade "decimal". Isso pode ajudar a esclarecer a relação entre a base 8 (octal), a base 10 (decimal) e a base 16 (hexadecimal).
HalosGhost
3
Arrrg. Toda base é a base 10! Veja o que seus
amigos estão
4

O que é o sistema hexadecimal

O sistema hexadecimal é o sistema de numeração da base 16 que usa 16 dígitos ( 0123456789ABCDEF), em oposição ao binário que usa 2 ( 01) ou decimal que usa 10 (0-9). Como existem apenas 10 dígitos numéricos (em nosso sistema), as letras de A a F são usadas para descrever "dígito nº 10", "dígito nº 11" etc. etc.

por que é usado tanto na computação

16 é uma potência de 2, o que facilita a conversão de números hexadecimais em números binários e, como você observou, "os computadores usam 0s e 1s para armazenar dados". Como cada dígito armazena exatamente 4 bits de dados, um dígito hexadecimal pode ser convertido em 4 dígitos binários (1 bit) com muita facilidade e vice-versa.

| hex bin  | hex bin  |
| 0   0000 | 8   1000 |
| 1   0001 | 9   1001 |
| 2   0010 | A   1010 |
| 3   0011 | B   1011 |
| 4   0100 | C   1100 |
| 5   0101 | D   1101 |
| 6   0110 | E   1110 |
| 7   0111 | F   1111 |

por que usamos hexadecimal

Torna mais fácil que o binário representar grandes números. Apenas dois dígitos hexadecimais podem representar 256 valores diferentes, como em:

dec  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
hex 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 ...

Quatro dígitos hexadecimais podem representar valores 65536 e assim por diante. O Hex facilita muito a inspeção de dados com algo chamado hexdump , pois letras, números e pontuação são armazenados em um formato que mapeia cada caractere para um número entre 0 e 256 (chamado ASCII ou, às vezes, usando outras codificações). Além disso, muitos outros formatos de arquivo (como PNG) são adaptados para que cada informação que o arquivo é composto contenha 256 bits.

Em resumo, 16 é uma potência de 2 e 256 é uma potência de 16. Isso torna uma boa maneira de representar números binários e texto ou outros dados.

Maçaneta
fonte
2

O que é o sistema hexadecimal?

Se você tem um número abcd, então isso é equivalente a ((a * + b) + c) + d. Então é assim:

  • abcd (binário) = ((a * 2 + b) * 2 + c) * 2 + d
  • abcd (octal) = ((a * 8 + b) * 8 + c) * 8 + d
  • abcd (decimal) = ((a * 10 + b) * 10 + c) * 10 + d
  • abcd (hexadecimal) = ((a * 16 + b) * 16 + c) * 16 + d

Em um sistema hexadecimal, você precisa de 16 dígitos, mas temos apenas dez dígitos disponíveis (0..9). Portanto, para os 6 dígitos ausentes, os caracteres A..F são usados ​​com A = 10, ..., F = 15.

Claro que você também pode pensar em muitos outros sistemas numéricos, por exemplo, com base de 5 ou 7.

Para o cálculo com números, não importa qual base você está usando. Você pode adicionar e multiplicar no sistema binário, no sistema decimal e no sistema hexadecimal. Nós somos usados ​​para calcular no sistema decimal, os computadores fazem isso no sistema binário.

Por que o sistema hexadecimal é tão usado na computação?

Como dito acima, não importa em qual sistema numérico você fornecer um número. O número subjacente é o mesmo, apenas a representação é alterada. O computador sempre armazena e usa internamente (por exemplo, calcula com) números em binário.

Então, por que os programadores (como eu) usam diferentes sistemas numéricos? Há duas razões para escolher um sistema numérico baseado em uma potência de 2. Primeiro é a falta e o segundo é uma boa visão de quais bits estão definidos.

Shortness

Se eu tiver uma função que está gravando o conteúdo de um buffer no console, poderia escrever um código que imprima em decimal, com 1 a 3 dígitos (decimal: 0..255). Se eu estiver escrevendo o número no formato binário, acabaria com uma saída de 1 a 8 dígitos (binário: 0..11111111). Eu também poderia usar o sistema octal e terminar com 1 a 3 dígitos (octal: 0..377) ou hexadecimal com 1 a 2 dígitos (hexadecimal: 0..ff).

Isso foi apenas para um byte. Vamos agora assumir que você deseja escrever um número de 32 bits:

  • binário: 0..11111111111111111111111111111111
  • octal: 0..37777777777
  • decimal: 4294967295
  • hexadecimal: 0..ffffffff

Como você pode ver, a saída hexadecimal é a mais curta.

Vendo os bits

Um padrão comum para armazenar informações compactadas é usar cada bit em um byte individualmente. Vamos dar por exemplo atributos de arquivo (consulte MDSN ). Você deseja os atributos "oculto", "arquivar", "somente leitura", "temporário" e outros. Você pode armazenar cada atributo em um byte ou agrupar as informações em um byte (ou vários bytes), em que cada bit representa exatamente um atributo. Se você olhar para o dwFlagsAndAttributes no artigo MSDN, poderá ver que o Windows está usando esse padrão.

Ficando na página do MSDN, tomemos FILE_ATTRIBUTE_ENCRYPTEDcomo exemplo, esse sinalizador é 16384 decimal e 0x4000 hexadecimal. O principal "0x" é apenas uma convenção de programador C para marcar números hexadecimais, então veremos 4000. Quando você quiser saber quais bits estão definidos, precisará converter 16384 em binário primeiro - nada que pudesse normalmente fazem com aritmética mental. Mas vamos usar o hexadecimal 4000. Isso é bastante fácil. 16 é 2 * 4, portanto, todo número hexadecimal é exatamente de 4 bits. Portanto, apenas convertemos 4 em binário 0100 e os zeros em binário 0000 e estamos prontos.

Frequentemente, não se trata de bits individuais, mas os programadores tendem a alinhar as coisas às potências de 2. Gostamos de carregar os programas não em um endereço aleatório, mas em um endereço com os 16 bits menos significativos configurados como zero. Dessa forma, se você tiver um endereço 0x12345678, poderá ver facilmente que esse endereço pertence ao programa carregado em 0x1234 e não ao endereço carregado em 0x03810000.

Prefere binário, octal ou hexadecimal?

Essa é uma questão de sabor. Se você quiser ver diretamente os bits binários, pode ser bom. Para números longos, o binário pode ser frustrante se você precisar contar os dígitos para ver se o bit 23 ou 24 está definido. Isso é mais fácil com o hexadecimal, porque cada dígito representa 4 bits, para que você tenha menos contagem envolvida. Pessoalmente, raramente uso octal. Isso é muito incomum.

Mas por que não usar a base 32?

A base 32 é uma potência de 2, isso é ótimo. Mas você precisaria de 32 dígitos como 0..9, A..V. Isso é muito mais dígitos para se lembrar (você consegue identificar facilmente qual número 'S' responderia?). Outra ressalva é que, na base 32, você perde o recurso interessante de que dois dígitos hexadecimais são exatamente um byte, o que é realmente útil se você der uma olhada no conteúdo da memória! Além disso, com a base 32, você ainda precisa de 2 dígitos para representar os valores que um byte pode ter. Para um valor de 32 bits, você precisa apenas de 7 dígitos em vez de 8 dígitos hexadecimais, mas isso não significa muito para viver com as desvantagens do sistema base 32.

Werner Henze
fonte
1

Os diferentes sistemas de representação numérica em uso atualmente são (= incluem):
binário, octal, decimal e hexadecimal.
Qual escolher geralmente depende da facilidade de uso da tarefa em questão.

binário é usado em sistemas de computador e tecnologia digital em geral, pois é fácil de representar em eletrônicos; As funções para números da base 2 são fáceis de construir, assim como a representação de on / off, true / false ou qualquer outra informação de dois estados repetida semelhante.

é bom ter octal se houver grupos de três dígitos binários, por exemplo, como é o caso nas configurações de permissão no Unix / Linux.

pulando decimal por um momento, hexadecimal é bom da mesma maneira que octal, mas com quatro dígitos binários, e o fato de 8 bits, um byte, se encaixar perfeitamente em dois dígitos hexadecimais. ( = a resposta ) A
seguir, os grupos pares de 8 bits em um computador são facilmente anotados, representados e compreendidos - ou seja; muito conveniente no uso diário ao escrever software, manipular dados (por exemplo, valores de cores rgb em HTML / CSS), formar estruturas de dados e qualquer outra coisa semelhante.

decimal . Pode-se adivinhar que o sistema decimal se desenvolveu a partir do fato de termos dez dedos das mãos e dos pés. Um único dígito representa o número de itens contados, um para cada dedo até o máximo de dez.

Estes representam sistemas numéricos com uma base de:
2, 8, 10 e 16.

Geralmente, a base informa quantos "itens" de um dígito você pode contar, por exemplo, o binário possui dois, o decimal possui dez.
Como hexadecimal possui 16 itens de um dígito, o sistema requer 16 "números", portanto, usando 0-9 e af (6 extras, comparado ao decimal), onde "a" é igual a 10 e "f" é igual a 15 no sistema decimal.

Para continuar no modo geral: qualquer base 2 ou superior funciona bem como qualquer outra coisa, desde que você tenha uma boa representação de um dígito.

Os números em decimal são formados por:

... d * 10³ + c * 10² + b * 10¹ + a * 10⁰

para um número decimal "dcba" - com d, c, b, a, escolhido entre 0123456789

Agora mude isso para:

... d * base³ + c * base² + b * base¹ + a * base⁰

e você tem uma forma mais geral que mostra como qualquer base 2 ou superior "funciona";
por exemplo, um dígito de cinco dígitos, a base 5 pode ser tão conveniente quanto qualquer um dos outros acima, ou por que não um sistema de 12 dígitos (uma dúzia) por tempo (12 horas = "10" base 12, com o primeiro "decimal" dizendo qual 1/12 [5 minutos] de uma hora é)

Nota: ⁰¹²³ - sobrescrito 0123 se a tela mostrar outra coisa

Hannu
fonte
Atualmente, isso pode ser um 'esboço' do que realmente pode se tornar.
Hannu