Pregunta

Después de todo este tiempo, nunca he pensado en hacer esta pregunta; Entiendo que esto vino de C ++, pero lo que era el razonamiento detrás de él:

  • Especificar los números decimales como se haría normalmente
  • especificar números octales por un 0
  • Especificar los números hexadecimales por un 0x
  • líder

¿Por qué 0? ¿Por 0x? ¿Hay una progresión natural para la base-32?

¿Fue útil?

Solución

C, el antepasado de C ++ y Java, fue desarrollado originalmente por Dennis Ritchie en el PDP-8 a principios de los años 70. Esas máquinas tenían un de 12 bits espacio de direcciones , por lo punteros (direcciones) fueron de 12 bits de longitud y más convenientemente representada en el código de tres dígitos octales 4 bits (primera palabra direccionable sería 000octal, última palabra 777octal direccionable).

Octal no se correlaciona bien en bytes de 8 bits porque cada dígito octal representa tres bits, por lo que siempre será bits sobrantes representables en la notación octal. Un byte todo-TRUE bits (1111 1111) es 377 en octal, pero FF en hexadecimal.

Hex es más fácil para la mayoría de la gente para convertir desde y hacia binario en sus cabezas, ya que los números binarios se expresa habitualmente en bloques de ocho (porque ese es el tamaño de un byte) y ocho es exactamente dos dígitos hexadecimales, pero la notación hexadecimal lo haría han sido torpe y engañoso en el tiempo de Dennis (lo que implica la capacidad para hacer frente a 16 bits). Los programadores necesitan pensar en binario cuando se trabaja con hardware (por la que cada bit representa típicamente un alambre físico) y cuando se trabaja con la lógica bit a bit (para el que cada bit tiene un significado definido por el programador).

Me imagino Dennis agregó el prefijo 0 como el más simple posible variación en los números decimales de todos los días, y más fácil para aquellos primeros analizadores de distinguir.

Creo Hex 0x__ notación se añadió a C un poco más tarde. El árbol de análisis sintáctico compilador para distinguir 1-9 (primer dígito de una constante decimal), 0 (primer dígito [insignificante] de una constante octal), y 0x (lo que indica una constante de seguir en dígitos siguientes hex) entre sí es considerablemente más complicado que simplemente utilizando un 0 como el indicador para cambiar de analizar los dígitos siguientes como octal en vez de decimal.

¿Por qué el diseño de Dennis de esta manera? programadores contemporáneos no aprecian que las primeras computadoras fueron controlados a menudo alternando instrucciones a la CPU por voltear físicamente interruptores en el panel frontal CPU, o con una tarjeta perforada o cinta de papel; todos los ambientes donde el ahorro de unos pasos o instrucciones representaron un ahorro de mano de obra significativa. Además, la memoria fue limitado y costoso, por lo que ahorra aún unas pocas instrucciones tenido un alto valor.

En resumen: 0 para octal porque era eficiente y analizable octal era fácil de manejar en PDP-8 (al menos para la manipulación de direcciones)

0x para hexagonal probablemente porque era una extensión natural y compatible con versiones anteriores del estándar octal prefijo y todavía relativamente eficiente para analizar.

Otros consejos

El prefijo cero para octal, y 0x para hex, son de los primeros días de Unix.

La razón de existencia data de octal a cuando no había hardware con bytes de 6 bits, lo que hizo octal la elección natural. Cada dígito octal representa 3 bits, por lo que un byte de 6 bits es de dos dígitos octales. Lo mismo ocurre con hex, de bytes de 8 bits, donde un dígito hexadecimal es de 4 bits y por lo tanto un byte es de dos dígitos hexadecimales. Usando octal para bytes de 8 bits requiere de 3 dígitos octales, de los cuales el primero sólo puede tener los valores 0, 1, 2 y 3 (el primer dígito es realmente 'TETRAL', no octal). No hay ninguna razón para ir a base32 a menos que alguien desarrolla un sistema en el que los bytes son diez bits de longitud, por lo que un byte de diez bits se podría representar como dos "nybbles" 5 bits.

“nuevos” números tenían que comenzar con un dígito, para trabajar con la sintaxis existente.

Práctica establecida tenía los nombres de variables y otros identificadores comenzando con una letra (o algunos otros símbolos, tal vez subrayar o signo del dólar). Por lo tanto “a”, “abc”, y “A04” son todos los nombres. Números comenzaron con un dígito. Así “3” y “3E5” son números.

Cuando se agrega nuevas cosas a un lenguaje de programación, que tratan de hacer que encajen en la sintaxis, la gramática y la semántica existentes, e intenta hacer que el código existente seguir trabajando. Por lo tanto, usted no quiere cambiar la sintaxis para hacer “x34” un número hexadecimal o un número octal “o34”.

Así que, ¿cómo encajar los números octales en esta sintaxis? Alguien se dio cuenta de que, a excepción de “0”, no hay necesidad de números que comienzan con “0”. Nadie tiene que escribir “0123” de 123. Así que usamos un cero para denotar números octales.

¿Qué pasa con los números hexadecimales? Se puede usar un sufijo, por lo que “34x” significa 34 16 . Sin embargo, a continuación, el analizador tiene que leer todo el camino hasta el final del numeral antes de que sabe cómo interpretar los dígitos (a no ser que se encuentra con uno de los dígitos a “a” f “”, lo que por supuesto indicar hexadecimal). Es “fácil” en el analizador de saber que el número hexadecimal es temprano. Pero usted todavía tiene que comenzar con un dígito, y el truco cero ya se ha utilizado, por lo que necesita algo más. fue recogido “x”, y ahora tenemos “0x” para hexadecimal.

(Lo anterior se basa en mi comprensión de análisis y un poco de historia general sobre el desarrollo del lenguaje, no en el conocimiento de las decisiones específicas hechas por los desarrolladores del compilador o comités de idiomas.)

No lo sé ...

0 es para 0ctal

0x es para, así, que ya hemos usado para referirse a 0 octal y hay una x en hexadecimal de manera tapón que allí también

En cuanto a la progresión natural, mejor mirada a los últimos lenguajes de programación que puede afijo subíndices tales como

123_27 (interpretar _ en el sentido de subíndice)

y así sucesivamente

Marcar

  

¿Hay una progresión natural para la base-32?

Esto es parte de la razón por Ada utiliza la forma 16 # para introducir constantes hexagonales, 8 # para octal, 2 # para binario, etc.

Yo no preocuparme demasiado por necesidad de espacio para "el crecimiento futuro" en basar embargo. Esto no es como la memoria RAM o espacio de direccionamiento donde se necesita un orden de magnitud más cada generación.

De hecho, los estudios han demostrado que octal y hexadecimal son más o menos el punto dulce para las representaciones legibles que son compatibles binario. Si vas a cualquier menor que octal, comienza a requerir un número ridículo de dígitos para representar números grandes. Si ir más alto que hexagonal, las tablas matemáticas consiguen ridículamente grande. Hex es en realidad un poco demasiado ya, pero Octal tiene el problema de que no se ajusta de manera uniforme en un byte.

No es un estándar de codificación para Base32 . Es muy similar a base 64 . Pero no es muy conveniente para leer. Hex se utiliza porque 2 dígitos hexadecimales se pueden utilizar para representar 1 byte de 8 bits. Y octal se utiliza sobre todo para los sistemas más antiguos que utilizan de 12 bits bytes. Se hizo para una representación más compacta de los datos cuando se compara a la visualización de registros primas como binario.

Debe también tenerse en cuenta que algunos lenguajes de utilizar O ### para octal y x ## o h ## para hex, así como, muchas otras variaciones.

Creo que 0x realidad vino para el mundo UNIX / Linux y fue captada por C / C ++ y otros lenguajes. Pero no sé la razón exacta o verdadero origen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top