Onde octais são úteis? [fechadas]


36

Eu apenas bati minha cabeça contra a mesa por cerca de 20 minutos, olhando para um bug totalmente estranho no PHP, e então percebi que há octal. O <% (* & #> octal.

Em suma, preenchi alguns literais com zeros para que o código fosse alinhado, eu sei, grande erro. Esqueceu sobre octais.

A questão é: alguém usa octais para algo além de permissões de arquivo? (Pessoalmente, prefiro, chmod ugo+rwxmas entendo que, se tiverem que ser gerados programaticamente, é útil usar octais.) Mas eles são úteis em qualquer outra situação?


16
Opção A: Culpe a si mesmo. Opção B: Culpe o mundo. Opção C: ria ao aprender algo.
Job

12
@Petrozza - na IMO, o uso no estilo C de um zero à esquerda para indicar octal nunca foi uma boa escolha, mas é história - provavelmente um pouco da herança C, embora possa ser ainda mais antiga. Eu acho que Ada tem uma das melhores convenções - um número octal seria escrito 8 # 1234567 #, um número hexadecimal 16 # abcdef #, etc e zeros à esquerda são apenas zeros à frente - qualquer base de 2 a 16 (pelo menos) é válida , e todos são visualmente óbvios e fáceis de entender.
Steve314

2
@Petruza Sua pergunta em sua forma original não foi construtiva para este site e foi aprimorada pela comunidade para que pudesse permanecer aberta: consulte as Perguntas frequentes para obter mais informações sobre por que as pessoas fazem isso e por que a incentivamos. Se você tiver alguma dúvida ou preocupação adicional, envie-a para o nosso site de meta-discussão , não na sua pergunta.

11
Opção D: "culpa PHP" é sempre a escolha certa, independentemente do problema
Cefalópode

2
@ Steve314 Eu concordo totalmente. Outro exemplo digno de nota é o Python, onde eles têm o 0oprefixo (que é consistente com, 0xe 0btalvez um pouco difícil de distinguir 00). E desde o Python 3, zeros à esquerda extras são um erro de sintaxe para evitar esse tipo de erro.
Sep12

Respostas:


42

Segundo a Wikipedia , octais não são tão comuns quanto costumavam ser. Como outros já mencionaram, no passado, os sistemas costumavam ter uma palavra de 12/24 / 36 bits, que é mais facilmente representada em octal do que em hexadecimal, mas atualmente, as arquiteturas x86 e i64 usam 16/32/64 bits. palavra, que é mais facilmente representada em hexadecimal e francamente feia em octal.

Os usos atuais, no entanto, incluem:

Observe que as linguagens de programação modernas às vezes não suportam mais octais devido à falta de casos de uso e ao potencial de erros. C # é um exemplo, como Eric Lippert escreveu isso na terceira e quarta edição do TCPL :

O C # não suporta literais octais, por dois motivos. Primeiro, quase ninguém usa literais octais atualmente. Segundo, se C # suportasse octal no formato padrão "zero inicial significa octal", seria uma fonte potencial de erros. Considere este código:

    FlightNumber = 0541;

Claramente, esta expressão pretende ser um literal decimal e não um literal octal.

Relacionado e apenas para referência e curiosidade, o Code, A Linguagem Oculta do Hardware de Computador tem uma excelente explicação fácil de seguir sobre sistemas de números octais e outros na página 55 - 63 .


11
Nessa nota, cuidado com o Javascript ao manipular a entrada do usuário. parseInt(011)==9
Darien

3
Isso é realmente interessante sobre os Yuki e Pamean. Ele apenas me ocorreu que a contagem dedo hexadecimal é razoavelmente fácil, se você usar o interior de cada dedo, usando alguma variação, como esta
ocodo

@Slomojo - você pode contar até 99 em seus dedos , na verdade ...
detly

3
+1 para uma resposta muito abrangente. Grace Hopper disse uma vez que tinha problemas para equilibrar seu talão de cheques, porque havia se tornado muito hábil em adicionar octal.
Macneil

14
@detly, se eu sei que preciso contar números grandes, usarei meus 10 dígitos como bits e contarei até 1024 com apenas meus dedos (apenas tenha cuidado com quem você mostra # 4, # 128 e # 132).
precisa saber é o seguinte

17

O Octal foi amplamente utilizado há 50 anos pela Digital Equipment Corp. (DEC) e outras empresas que possuíam computadores com uma palavra de 12 bits (por exemplo, o PDP-8) ou outros múltiplos de seis, como 18 e 36 (por exemplo, UNIVAC 1108 ) Eu usei o PDP-8 e o UNIVAC 1108 na pós-graduação. Os caracteres nas duas máquinas geralmente usavam seis bits, não 8.

Formato de instrução PDP-8

Formato de instrução PDP-8 - observe que os bits estão numerados de 0 a 11. O bit 0 foi o MSB (bit mais significativo).

Quando o DEC saiu com o PDP-11 de 16 bits, eles continuaram a usar octal em sua documentação, em vez de hexadecimal, conforme usado pelos outros fabricantes de minicomputadores que lançavam máquinas de 16 bits na época. Provavelmente, isso ocorreu devido aos vários campos de 3 bits nos formatos de instrução PDP-11, como Register, Mode e Src / Dest, que se deviam decodificar como um dígito octal. (Obrigado a John Strohm por apontar isso.)

Curiosamente, quando a Motorola lançou seu microprocessador 68000, que foi fortemente influenciado pelo PDP-11 e tinha os mesmos campos Modo e Registro de 3 bits nas instruções, eles escolheram usar apenas hexadecimal na documentação.

Como o PDP-11 usava a notação octal, os códigos de permissão originais do Unix, que apareceram pela primeira vez no PDP-11, também usavam o octal. Esse legado persiste no Linux, onde o comando chmod ainda usa octal para especificar cada um dos campos 'rwx' de três bits.

Um pouco mais de trivialidades - o CompuServe, um serviço on-line dial-up amplamente utilizado nos anos 80 e início dos 90 (antes de ser ofuscado pela AOL), rodava nos minicomputadores DEC, pelo menos originalmente. Todos os IDs de usuário eram numéricos e, em algum momento, observei que eles nunca incluíam 8 ou 9, portanto estavam em octal. Meu antigo ID do CIS era 70205.


11
Seu comentário sobre a documentação do PDP-11 está incorreto. O PDP-11 possuía 8 registros. R0-R5 eram registros de uso geral. R6 foi o ponteiro da pilha e R7 foi o PC. A instrução MOV levou dois números de registro de 3 bits e dois modos de endereçamento de 3 bits. Octal captura os campos de registro e modo PERFEITAMENTE. (Duvido muito que isso tenha sido um acidente.) O uso do hex teria confundido tudo. PUSH e POP estavam apenas endereçando modos que usavam R6. O operando imediato era um modo de endereçamento que usava R7.
John R. Strohm

@ JohnR.Strohm Obrigado pelo comentário sobre os registros de 3 bits. Concordo com sua análise e atualizei minha resposta.
tcrosley

Então, DEC trabalhou em outubro. Deveria ter usado múltiplos de 3,32 bits para evitar confusão.
user234461

É engraçado como eu nunca considerei as permissões do Unix um número octal, sempre pensei nisso como três dígitos individuais escritos juntos, cada um representando os três bits rwx, para que pudessem ser octal, decimal ou até hexadecimal.
axl

11

O Heathkit os usou no painel frontal do H-8 e para listagens em linguagem assembly do software do painel frontal (chamado PAM-8). Namorando comigo, eu sei.

insira a descrição da imagem aqui

Hoje em dia os octais são muito raros; todo mundo parece usar hexadecimal. Mas os números ainda parecem números em octal e você não precisa de uma linha adicional de teclas para os dígitos A a F.


2
+1 para o H-8. Apesar de ser octal do lado de fora, a CPU era um 8080A, que era todo em bytes. Vai figger.
Blrfl

Eu acho que eles usavam octal por comumidade com o H-11 (que tinha uma CPU PDP-11).
Jerry Coffin

2
O 8080 tinha bytes de 8 bits, mas o conjunto de instruções fazia mais sentido se olhado em octal do que em hexadecimal.
RBerteig

6

Uma das razões pelas quais a octal vê uso é porque é a maior base que é uma potência de 2 para a qual você não precisa de caracteres especiais - ou seja, todos os dígitos podem ser numéricos. A base 16 (a próxima acima da base 8) requer dígitos não numéricos (geralmente A, B, C, D, E, F).


Sei que isso é antigo, mas por que seria preferível usar apenas dígitos numéricos do que também usar letras?
Petruza

5

Eu uso octal todos os dias. Toda vez que preciso chmod um arquivo, uso octal (eu antecipo a notação u + r ...). Toda vez que quero incorporar um caractere de controle dentro de uma string, uso octal ... (Sim, eu poderia usar hex, mas octal é o que uso).


2
+1 para "mas octal é o que eu uso" :)
JoelFan

5

Qualquer pessoa que precise expressar combinações de bits agrupados em três.

Por que alguém usa hexadecimal?


Coisas em cima da minha cabeça que são expressas como números octais:

  • Códigos rangidos pelos transponders do Modo 3A em aviões
  • Certos valores encontrados no barramento aviônico ARINC 429
  • Endereços SCSI
  • Códigos de chave na ncursesbiblioteca

11
A diferença é que hex é "natural" como meio byte. Dois dígitos hexadecimais = 1 byte. Mas você não pode dividir bytes em dígitos octais.
Mason Wheeler

2
A primeira linha afirma o óbvio. O segundo faz uma analogia ruim.
Aug2

3
E hex é completamente antinatural para qualquer coisa que precise ser expressa em grupos de três bits, como os modos de arquivo Unix acima mencionados. Não existe uma lei que diga que os dígitos de um sistema de numeração específico precisam estar alinhados com bytes. Se houvesse, expressar qualquer coisa para um computador como base 10 seria uma prática pior do que a base 8, que pelo menos se alinha com grupos de bits.
Blrfl

6
uma sequência hexadecimal típica é obviamente uma sequência hexadecimal. octal não é.
Paul Nathan

11
@Blrfl: Então, quantos desses mencionados "[coisas que] precisam ser expressas em grupos de três bits" existem além do exemplo canônico? Essa é a pergunta real, que você deixou sem resposta até agora. Em vez disso, você faz outra analogia ruim. Existe um uso real para a representação decimal, porque simplesmente aprendemos a lidar com isso. Qual você calculará mais rapidamente? 7 * 6ou 07 * 06? Usamos decimal para representar números, pois podemos lidar com eles da melhor maneira e hexadecimal para representar números muito próximos de como a máquina os armazena. E fazemos muito isso. Este site está cheio de evidências.
Aug2

5

Quando eu trabalhei nos mainframes do CDC (com uma palavra de 60 bits e 12 bits para a PPU), todos os core dumps foram feitos em octal (20 dígitos octais por palavra, 4 por palavra PPU).


3

Como hexadecimal, a notação octal às vezes é usada para especificar códigos de caracteres. Pode ser útil pela mesma razão que o hexadecimal: é mais compacto que o binário, mas muito fácil de traduzir para o binário na sua cabeça.


2

Como o Hex, os números octais são fáceis de converter de binários. Apenas agrupe os dígitos binários em grupos de três, começando à direita.

10010101110  // binary

// conversion
(010)(010)(101)(110)
// so, in octal we have...
(2)(2)(5)(6)
2256

10010101110 (base 2) == 2256 (base 8)

7
Isto é óbvio. A questão é sobre quando isso é realmente usado .
Aug2

2
@ back2dos: fique à vontade para postar uma resposta em vez de deixar o mesmo comentário várias vezes.
Ed S.

4
@ Ed S. Você nem tentou responder à pergunta. Você disse algo óbvio que o pôster original quase certamente já sabia a resposta. Como os moderadores gostam de dizer, não é para isso que estamos filmando. Consulte meta.programmers.stackexchange.com/questions/1968/… para obter mais informações.
btilly

@ back2dos, btilly - As respostas nos sites Stackexhange não são apenas para o OP, elas se tornam um recurso persistente para qualquer leitor que passa. Todos os fatos óbvios , não são necessariamente óbvios para todos, se essa resposta ajudar a pessoa a gastar um centavo .
Ocho 5/08

2
@Slomojo embora por esse argumento, todas as perguntas sejam elegíveis para se tornar um wiki para todos os aspectos relacionados a um tópico. O ponto é que isso não responde à pergunta . Essa resposta certamente pode ser válida em outro lugar: "Como converter rapidamente mentalmente para octal?"
Nicole

2

Não. Nunca os usei. Nem mesmo para definir permissões de arquivo, porque faço isso tão raramente que acho difícil de ler.

Então, sim, há o benefício óbvio da conversão de e para binário.
No entanto, como já apontado pelo @Mason, o hex é muito mais "natural", porque 2 dígitos hexadecimais formam um byte. É útil para representar cores, endereços IP, máscaras de bytes, RGB / ARGB 24/32 bits, etc. O octal do outro lado não é realmente prático, porque você raramente tem cenários em que trabalha em termos de grupos de 3 bits.

Permissões de arquivo são, de fato, a única coisa em que consigo pensar. E se não houver área de uso a partir de agora, duvido que alguma vez exista uma. Desde os últimos 20 anos, o espaço tornou-se tão barato, tornou-se muito incomum empacotar informações com tanta rigidez, às custas do alinhamento, facilidade de uso e extensibilidade.


2

Um pouco de lado, mas o uso público está no metrô de Londres. Cada trem tem uma identidade física e uma identidade separada nos horários exibidos durante o serviço - veja aqui: https://upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg (observe o 402 na parte superior da tela de destino). Embora os componentes eletrônicos dos monitores sejam baseados em decimais padrão, você nunca vê os dígitos 8 ou 9 porque estão vinculados ao hardware octal herdado no sistema de sinalização.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.