Pergunta

Depois de todo esse tempo, eu nunca tinha pensado em pedir a esta questão;Eu entendo que isso veio de c++, mas qual foi o raciocínio por trás dele:

  • Especifique os números decimais como você normalmente
  • Especificar números octais por um 0 à esquerda
  • Especificar números hexadecimais por um líder 0x

Por que 0?Por 0x?Há um progressão natural para a base-32?

Foi útil?

Solução

C, o ancestral do C++ e Java, que foi originalmente desenvolvido por Dennis Richie no PDP-8, no início dos anos 70.Essas máquinas tinham um 12-bit espaço de endereço, então, ponteiros (endereços) foram de 12 bits de comprimento e mais convenientemente representados no código de três de 4 bits dígitos octais (primeiro endereçável palavra seria 000octal, último endereçável palavra 777octal).

Octal não corresponde bem aos 8 bits, bytes, porque cada dígito octal representa três bits, então sempre haverá excesso de bits representados em notação octal.Um todo-o-VERDADEIRO-bits byte (1111 1111) é 377 em octal, mas FF em hexadecimal.

Hex é mais fácil para a maioria das pessoas para converter de e para binário em suas cabeças, uma vez que os números binários são normalmente expressos em blocos de oito (porque esse é o tamanho de um byte) e oito é exatamente dois dígitos Hexadecimais, mas a notação Hexadecimal teria sido desajeitado e confuso nas Dennis' tempo (o que implica a capacidade de endereço de 16 bits).Os programadores precisam pensar em binário quando se trabalha com hardware (para que cada bit representa normalmente um cabo físico) e quando se trabalha com bit-wise lógica (para o qual cada bit tem uma definidas programador significado).

Eu imagino Dennis adicionado a 0 prefixo como o mais simples possível variação no diário números decimais, e mais fácil para os primeiros analisadores de distinguir.

Eu acredito que a notação Hexadecimal 0 x__ foi adicionado ao C um pouco mais tarde.O compilador árvore de análise para distinguir 1-9 (primeiro dígito de um número decimal constante), 0 (primeiro [insignificante] dígitos de um octal constante), e 0 (indicando uma constante hexadecimal para seguir subsequentes dígitos) do outro é consideravelmente mais complicada do que usando apenas um 0 à esquerda como o indicador mudar de análise subseqüente dígitos octais em vez de decimal.

Por que Dennis design desta forma? Contemporânea programadores não apreciam que os primeiros computadores foram muitas vezes controlada pela alternância de instruções para a CPU fisicamente inversão de parâmetros sobre as CPUs do painel frontal, ou com um soco cartão ou fita de papel;todos os ambientes onde verão a poucos passos ou instruções representado poupanças significativas de trabalho manual.Além disso, a memória era limitado e caro, mesmo assim salvar algumas instruções teve um valor alto.

Em resumo:0 para octal porque foi eficiente analisáveis e octal foi amigável no PDP-8 (pelo menos para o endereço de manipulação)

0x para hex, provavelmente porque ele era natural e compatível com versões anteriores de extensão em octal prefixo padrão, e ainda relativamente eficiente para analisar.

Outras dicas

O prefixo zero para octal e 0x para hexadecimal são dos primeiros dias do Unix.

A razão para a existência da Octal data de quando havia hardware com bytes de 6 bits, o que fez de octal a escolha natural. Cada dígito octal representa 3 bits, portanto, um byte de 6 bits tem dois dígitos octais. O mesmo vale para hexadecimal, de bytes de 8 bits, onde um dígito hexadecimal é de 4 bits e, portanto, um byte são dois dígitos hexadecimais. O uso de bytes octais para bytes de 8 bits requer 3 dígitos octais, dos quais o primeiro pode ter apenas os valores 0, 1, 2 e 3 (o primeiro dígito é realmente 'tetral', não octal). Não há razão para ir para Base32, a menos que alguém desenvolva um sistema no qual os bytes tenham dez bits de comprimento, para que um byte de dez bits possa ser representado como dois "Nybbles" de 5 bits.

"Novo" numerais tinha que começar com um dígito, com as de sintaxe.

Prática estabelecida tinham nomes de variáveis e outros identificadores, iniciando com uma letra (ou alguns outros símbolos, talvez carácter de sublinhado ou um sinal de dólar).Assim, "a", "abc", e "a04" são todos os nomes.Números iniciados com um dígito.Assim, "3" e "3e5" são números.

Quando você adicionar coisas novas para uma linguagem de programação, você busca para torná-los aptos à sintaxe, gramática e semântica, e tenta fazer um código existente continuar a trabalhar.Assim, você não deseja alterar a sintaxe para fazer "x34" um número hexadecimal ou "o34" um número octal.

Então, como você ajusta octal numerais em esta sintaxe?Alguém percebeu que, exceto para "0", não há necessidade de números começando com "0".Ninguém precisa escrever "0123" para 123.Então, nós usamos um zero à esquerda para denotar números octais.

O que sobre números hexadecimais?Você pode usar um sufixo, de modo que "34x" significa 3416.No entanto, em seguida, o analisador deve ler todo o caminho para o fim do numeral antes de que sabe como interpretar os dígitos (a menos que ele encontra um dos "a" a "f" dígitos, o que seria, claro, indicar hexadecimal).Ele é "mais fácil" sobre o analisador de saber que o número hexadecimal é cedo.Mas você ainda tem que começar com um dígito, o zero truque já foi usado, então precisamos de algo mais."x" foi escolhido, e agora temos "0x" para hexadecimal.

(O exemplo acima é baseado na minha compreensão, de análise e de alguma história geral sobre o desenvolvimento da linguagem, não no conhecimento de decisões específicas feitas pelo compilador desenvolvedores ou os comitês de línguas.)

Eu não sei ...

0 é para 0ctal

0x é porque, bem, já usamos 0 para significar octal e há um x em hexadecimal tão bung que lá também

Quanto à progressão natural, a melhor aparência para as mais recentes linguagens de programação que podem afixar subscritos como

123_27 (interprete _ para significar subscrito)

e assim por diante

?

Marca

Existe uma progressão natural para a Base-32?

Isso é parte do motivo pelo qual a ADA usa o formulário 16# para introduzir constantes hexadecimais, 8# para octal, 2# para binário, etc.

Eu não me preocuparia muito com a necessidade de espaço para "crescimento futuro" na base. Isso não é como RAM ou abordar espaço onde você precisa de uma ordem de magnitude mais todas as gerações.

De fato, estudos mostraram que octal e hexadecipal são praticamente os ponto certo Para representações legíveis por humanos que são compatíveis com binários. Se você for menor que o octal, começará a exigir um número ridículo de dígitos para representar números maiores. Se você for mais alto que o Hex, as mesas de matemática ficam ridiculamente grandes. A hexadecimal já é um pouco demais, mas Octal tem o problema de não se encaixar uniformemente em um byte.

Há um padrão de codificação para Base32.Ele é muito semelhante ao Base64.Mas não é muito conveniente para leitura.Hex é usado por 2 dígitos hexadecimais podem ser usados para representar 1 byte de 8 bits.E octal foi utilizado principalmente para sistemas mais antigos que usado 12-bit bytes.É feita para uma representação mais compacta dos dados quando comparado com a exibição de matérias registra como binário.

Também deve ser notado que algumas línguas usam o### para octal e x## ou h## hex, bem como, muitas outras variações.

eu penso isso 0x Na verdade, veio para o mundo Unix/Linux e foi escolhido por C/C ++ e outros idiomas. Mas não conheço a razão exata ou a verdadeira origem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top