¿Dónde son útiles los octales? [cerrado]


36

Me golpeé la cabeza contra la mesa durante unos 20 minutos mirando un error totalmente extraño en PHP, y luego me di cuenta de que hay octal. El <% (* & #> octal.

En resumen, rellené algunos literales con ceros para que el código estuviera alineado, lo sé, gran error. Se olvidó de los octales.

La pregunta es, ¿alguien usa octals para algo más que permisos de archivo? (Personalmente prefiero chmod ugo+rwxpero entiendo que si tienen que ser generados programáticamente, es útil usar los octales). ¿Pero son útiles en cualquier otra situación?


16
Opción A: Culpate a ti mismo. Opción B: culpar al mundo. Opción C: ríete cuando hayas aprendido algo.
Trabajo

12
@Petrozza: en mi opinión, el uso de estilo C de un cero inicial para indicar octal nunca fue una buena opción, pero es historia, probablemente un poco de herencia C, aunque puede ser aún más antiguo. Creo que Ada tiene una de las mejores convenciones: un número octal se escribiría 8 # 1234567 #, un número hexadecimal 16 # abcdef #, etc. y los ceros iniciales son solo ceros iniciales: cualquier base del 2 al 16 (al menos) es válida , y todos son visualmente obvios y fáciles de entender.
Steve314

2
@Petruza Su pregunta en su forma original no fue constructiva para este sitio, y fue mejorada por la comunidad para que pudiera permanecer abierta: consulte las Preguntas frecuentes para obtener más información sobre por qué las personas hacen esto y por qué lo alentamos. Si tiene preguntas o inquietudes adicionales, hágalas llegar en nuestro sitio de meta-discusión , no en su pregunta.

11
Opción D: "culpar a PHP" es siempre la opción correcta, independientemente del problema
Cephalopod

2
@ Steve314 Estoy totalmente de acuerdo. Otro ejemplo digno de mención es Python, donde tienen el 0oprefijo (que es consistente 0xy 0bquizás un poco difícil de distinguir 00). Y desde Python 3, los ceros iniciales adicionales son un error de sintaxis para evitar este tipo de errores.
5gon12eder

Respuestas:


42

Según Wikipedia , los octales no son tan comunes como solían ser. Como otros ya han mencionado, en el pasado, los sistemas solían tener una palabra de 12/24/36 bits, que se representa más fácilmente en octal que en hexadecimal, pero actualmente, las arquitecturas x86 e i64 usan un 16/32/64 bit palabra, que se representa más fácilmente en hexadecimal y francamente fea en octal.

Los usos actuales, sin embargo, incluyen:

Tenga en cuenta que los lenguajes de programación modernos a veces ya no admiten octals debido a la falta de casos de uso y la posibilidad de errores. C # es un ejemplo, ya que Eric Lippert escribió esto en la tercera y cuarta edición de TCPL :

C # no admite literales octales, por dos razones. Primero, casi nadie usa literales octales en estos días. En segundo lugar, si C # admite octal en el formato estándar "cero inicial significa octal", entonces sería una fuente potencial de errores. Considera este código:

    FlightNumber = 0541;

Claramente, esta expresión pretende ser un literal decimal, no un literal octal.

Relacionado, y solo para referencia y curiosidad, Code, The Hidden Language of Computer Hardware tiene una excelente explicación fácil de seguir sobre sistemas de números octales y otros en la página 55-63 .


1
En esa nota, tenga cuidado con Javascript cuando maneje la entrada del usuario. parseInt(011)==9
Darien

3
Eso es realmente interesante sobre los Yuki y Pamean. Se me ocurrió que el recuento de dedos hexadecimales es razonablemente fácil, si usa el interior de cada dedo, usando alguna variación, como esta
ocodo

@Slomojo: puedes contar hasta 99 en tus dedos , de hecho ...
detly

3
+1 para una respuesta muy completa. Grace Hopper dijo una vez que tenía problemas para equilibrar su talonario de cheques, porque se había vuelto muy hábil agregando octal.
Macneil

14
@detly, si sé que necesito contar números grandes, usaré mis 10 dígitos como bits y contaré hasta 1024 con solo mis dedos (solo tenga cuidado a quién le muestra # 4, # 128 y # 132).
zzzzBov

17

Octal fue ampliamente utilizado hace unos 50 años por Digital Equipment Corp. (DEC) y otras compañías que tenían computadoras con una palabra de 12 bits (por ejemplo, el PDP-8) u otros múltiplos de seis, como 18 y 36 (por ejemplo, UNIVAC 1108 ) Usé tanto el PDP-8 como el UNIVAC 1108 en la escuela de posgrado. Los caracteres en ambas máquinas generalmente usan seis bits, no 8.

Formato de instrucción PDP-8

Formato de instrucción PDP-8: tenga en cuenta que los bits están numerados 0 -> 11. El bit 0 era el MSB (bit más significativo).

Cuando DEC salió con el PDP-11 de 16 bits, continuaron usando octal en su documentación en lugar de hexadecimal como lo usaban los otros fabricantes de minicomputadoras que salían con máquinas de 16 bits en ese momento. Esto probablemente se debió a los múltiples campos de 3 bits dentro de los formatos de instrucción PDP-11 como Register, Mode y Src / Dest que se prestaron para ser decodificados como un dígito octal. (Gracias a John Strohm por señalar esto).

Curiosamente, cuando Motorola lanzó su microprocesador 68000, que estaba muy influenciado por el PDP-11 y tenía los mismos campos de Modo y Registro de 3 bits en las instrucciones, eligieron usar solo hexadecimal en su documentación.

Debido a que el PDP-11 usaba notación octal, los códigos de permiso originales para Unix, que aparecieron por primera vez en el PDP-11, también usaban octal. Este legado persiste en Linux, donde el comando chmod todavía usa octal para especificar cada uno de los campos 'rwx' de tres bits.

Algunas curiosidades más: CompuServe, que era un servicio en línea de acceso telefónico ampliamente utilizado en los años 80 y principios de los 90 (antes de ser eclipsado por AOL), funcionaba en minicomputadoras DEC, al menos originalmente. Todos los ID de usuario eran numéricos, y en algún momento hice la observación de que nunca incluyeron 8 o 9 en ellos, por lo tanto estaban en octal. Mi antigua identificación de CIS era 70205.


1
Su comentario sobre la documentación PDP-11 es incorrecto. El PDP-11 tenía 8 registros. R0-R5 fueron registros de propósito general. R6 era el puntero de la pila, y R7 era la PC. La instrucción MOV tomó dos números de registro de 3 bits y dos modos de direccionamiento de 3 bits. Octal captura los campos de registro y modo PERFECTAMENTE. (Dudo mucho que esto haya sido un accidente). El uso de hexadecimal habría confundido todo. PUSH y POP solo abordaban modos que usaban R6. El operando inmediato era un modo de direccionamiento que usaba R7.
John R. Strohm

@ JohnR.Strohm Gracias por el comentario sobre los registros de 3 bits. Estoy de acuerdo con su análisis y he actualizado mi respuesta.
tcrosley

Entonces DEC trabajó en OCT. Debería haber usado múltiplos de 3.32 bits para evitar confusiones.
user234461

Es curioso cómo nunca consideré que los permisos de Unix fueran un número octal, siempre lo pensé como tres dígitos individuales escritos juntos, cada uno representando los tres bits rwx, por lo que podrían ser octales, decimales o incluso hexadecimales.
axl

11

Heathkit los usó para el panel frontal de su H-8 y para listas de lenguaje ensamblador de su software de panel frontal (llamado PAM-8). Salir conmigo mismo, lo sé.

ingrese la descripción de la imagen aquí

Hoy en día los ojos son muy raros; todos parecen usar hechizo. Pero los números aún se ven como números en octal, y no necesita una fila adicional de teclas para los dígitos A a F.


2
+1 para el H-8. A pesar de ser octal en el exterior, la CPU era un 8080A, que eran todos bytes. Vaya figger.
Blrfl

Supongo que usaron octal para la similitud con el H-11 (que tenía una CPU PDP-11).
Jerry Coffin

2
El 8080 tenía bytes de 8 bits, pero el conjunto de instrucciones tenía más sentido si se miraba en octal que en hexadecimal.
RBerteig

6

Una de las razones por las que octal ve el uso es porque es la base más grande que tiene una potencia de 2 para la que no necesita ningún carácter especial, es decir, todos los dígitos pueden ser numéricos. La base 16 (la siguiente desde la base 8) requiere dígitos no numéricos (generalmente A, B, C, D, E, F).


Sé que esto es antiguo, pero ¿por qué sería preferible usar solo dígitos numéricos a también usar letras?
Petruza

5

Yo uso octal todos los días. Cada vez que necesito modificar un archivo utilizo octal (soy anterior a la notación u + r ...). Cada vez que quiero incrustar un carácter de control dentro de una cadena, uso octal ... (Sí, podría usar hexadecimal, pero octal es lo que uso).


2
+1 para "pero octal es lo que uso" :)
JoelFan

5

Cualquiera que necesite expresar combinaciones de bits agrupados en tres.

¿Por qué alguien usa hexadecimal?


Cosas fuera de mi cabeza que se expresan como números octales:

  • Códigos graznados por transpondedores de Modo 3A en aviones
  • Ciertos valores encontrados en el bus de aviónica ARINC 429
  • Direcciones SCSI
  • Códigos clave en la ncursesbiblioteca

11
La diferencia es que el hex es "natural" como medio byte. Dos dígitos hexadecimales = 1 byte. Pero no puede dividir bytes en dígitos octales.
Mason Wheeler

2
La primera línea establece lo obvio. El segundo hace una pobre analogía.
back2dos

3
Y hexadecimal es completamente antinatural para cualquier cosa que deba expresarse en grupos de tres bits, como los modos de archivo Unix mencionados anteriormente. No hay ninguna ley que diga que los dígitos de un sistema de numeración en particular tengan que alinearse con bytes. Si lo hubiera, expresar cualquier cosa a una computadora como base 10 sería una práctica peor que la base 8, que al menos se alinea con grupos de bits.
Blrfl

66
una cadena hexadecimal típica es obviamente una cadena hexadecimal. octal no lo es.
Paul Nathan

1
@Blrfl: Entonces, ¿cuántas de estas "[cosas que] deben expresarse en grupos de tres bits" mencionadas hay aparte del ejemplo canónico? Esa es la pregunta real, que dejaste sin respuesta hasta ahora. En cambio, haces otra pobre analogía. Hay un uso real para la representación decimal, porque simplemente aprendimos a manejarla. ¿Cuál uno que calcular más rápido? 7 * 6o 07 * 06? Utilizamos decimales para representar números, ya que podemos manejarlos mejor y hexadecimales para representar números muy cercanos a cómo la máquina los almacena. Y hacemos esto mucho. Este sitio está lleno de evidencia de ello.
back2dos

5

Cuando trabajaba en mainframes CDC (con una palabra de 60 bits, palabra de 12 bits para la PPU), todos los volcados de núcleo y demás se hicieron en octal (20 dígitos octales por palabra, 4 por palabra PPU).


3

Al igual que la hexadecimal, la notación octal a veces se usa para especificar códigos de caracteres. Puede ser útil por la misma razón que el hexadecimal: es más compacto que binario, pero muy fácil de traducir a binario en tu cabeza.


2

Al igual que Hex, los números octales son fáciles de convertir de binarios. Simplemente agrupe los dígitos binarios en grupos de tres, comenzando por la derecha.

10010101110  // binary

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

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

77
Esto es obvio. La pregunta es sobre cuándo esto se usa realmente .
back2dos

2
@ back2dos: entonces no dude en publicar una respuesta en lugar de dejar el mismo comentario varias veces.
Ed S.

44
@Ed S. Ni siquiera intentaste responder la pregunta. Dijiste algo obvio que el póster original casi seguramente ya sabía la respuesta. Como a los moderadores les gusta decir, esto no es lo que estamos buscando. Ver meta.programmers.stackexchange.com/questions/1968/… para más información.
btilly

@ back2dos, btilly: las respuestas en los sitios de Stackexhange no son solo para el OP, se convierten en un recurso persistente para cualquier lector que pase. Todos los hechos obvios , no son necesariamente obvios para todos, si esta respuesta ayuda al centavo a alguien que tiene valor.
ocodo

2
@Slomojo, aunque por ese argumento, cada pregunta es elegible para convertirse en un wiki para cada aspecto relacionado de un tema. El punto es que esto no responde la pregunta . Esta respuesta ciertamente puede ser válida en otro lugar, a "¿Cómo convertir mentalmente rápidamente a octal?"
Nicole

2

No Nunca los usé. Ni siquiera para configurar permisos de archivos, porque lo hago muy raramente me resulta difícil de leer.

Entonces sí, existe el beneficio obvio de la conversión desde y hacia binario.
Sin embargo, como ya señaló @Mason, el hex es mucho más "natural", porque 2 dígitos hexadecimales forman un byte. Es útil para representar colores RGB / ARGB de 24/32 bits, direcciones IP, máscaras de bytes, etc. Octal en el otro lado no es realmente práctico, porque rara vez tiene escenarios en los que trabaja en términos de grupos de 3 bits.

Los permisos de archivos son, de hecho, lo único en lo que puedo pensar. Y si no hay un área de uso a partir de ahora, dudo que alguna vez haya una. Desde los últimos 20 años, el espacio se ha vuelto tan barato, se ha vuelto muy poco frecuente empaquetar la información de manera tan ajustada, a costa de la alineación, la facilidad de uso y la extensibilidad.


2

Un poco aparte, pero un uso público está en el metro de Londres. Cada tren tiene una identidad física y una identidad separada en los horarios que se muestra cuando está en servicio; consulte aquí: https://upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg (tenga en cuenta el 402 en la parte superior de la pantalla de destino). Aunque los componentes electrónicos de las pantallas están basados ​​en decimales estándar, nunca ve los dígitos 8 o 9 porque están vinculados a hardware heredado basado en octal en el sistema de señalización.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.