¿Por qué los números hexadecimales tienen el prefijo 0x?

414

¿Por qué los números hexadecimales tienen el prefijo 0x? Entiendo el uso del prefijo pero no entiendo la importancia de por qué 0xfue elegido.

unj2
fuente
99
Ahora me doy cuenta de que el título y el texto hacen dos preguntas completamente diferentes. La mayoría de las respuestas se centran en la pregunta del título. La respuesta a la pregunta en el texto es simplemente "no significa nada, es simplemente un prefijo que le dice al compilador que el entero está escrito en hexadecimal".
Andreas Rejbrand
30
Para ser pedante, uno también podría interpretar la pregunta en el título de dos maneras diferentes: 1) "¿Por qué los números hexadecimales tienen el prefijo 0x, en lugar de cualquier otro prefijo o indicador?" 2) "¿Por qué necesitamos usar un prefijo al ingresar números hexadecimales? ¿Seguramente el compilador reconocerá 58A como un número hexadecimal incluso sin el prefijo?" La respuesta a la segunda interpretación de la pregunta es trivial. "123" también es un número hexadecimal.
Andreas Rejbrand

Respuestas:

440

En pocas palabras: El 0le dice al analizador se trata de una constante (y no un / palabra reservada identificador). Todavía se necesita algo para especificar la base numérica: xes una elección arbitraria.

Larga historia: en los años 60, los sistemas numéricos de programación predominantes eran decimales y octales : los mainframes tenían 12, 24 o 36 bits por byte, que es muy divisible por 3 = log2 (8).

El lenguaje BCPL utilizó la sintaxis 8 1234para los números octales. Cuando Ken Thompson creó B de BCPL, usó el 0prefijo en su lugar. Esto es genial porque

  1. una constante entera ahora siempre consiste en una sola ficha,
  2. el analizador todavía puede decir de inmediato que tiene una constante,
  3. el analizador puede decirle inmediatamente a la base ( 0es lo mismo en ambas bases),
  4. es matemáticamente sano ( 00005 == 05), y
  5. no se necesitan caracteres especiales preciosos (como en #123).

Cuando C se creó a partir de B, surgió la necesidad de números hexadecimales (el PDP-11 tenía palabras de 16 bits) y todos los puntos anteriores aún eran válidos. Como todavía se necesitaban octales para otras máquinas, 0xse eligió arbitrariamente ( 00probablemente se descartó como incómodo).

C # es un descendiente de C, por lo que hereda la sintaxis.

Řrřola
fuente
112
No pienso 0xen la 00preferencia / incomodidad. 00rompería el código existente. 0010como octal es 8, mientras que 0010como hexadecimal sería 16. No podían usar ningún número como indicador de segundo dígito (excepto 8o 9, y ninguno de los dos tiene ningún significado relacionado con hexadecimal), por lo que una letra es imprescindible. Y eso deja ya sea 0ho 0x( H e X idecimal). Desde este punto parece que realmente ha vuelto a la preferencia.
GManNickG
23
El uso de un 0prefijo para octal ha causado muchos problemas a lo largo de los años. Especialmente en países como el Reino Unido, donde los números de teléfono comienzan con a 0. Javascript y muchos otros lenguajes los analizarían como octal, destrozando el número antes de almacenarlo. Para agregar a la diversión, un producto de base de datos popular volvería silenciosamente al análisis decimal si el número contuviera un 8o 9.
Básico
1
12, 24 y 36 también son divisibles por 4, entonces ¿por qué no pensaron en hexadecimal para eso?
phuclv
44
@ LưuVĩnhPhúc Probablemente porque el hexadecimal no era muy relevante. La mayor parte del hardware, software y documentación de la época se ajusta mucho mejor a octal. BCPL se implementó por primera vez en un IBM 7094 de 36 bits , con un formato de instrucciones dividido en dos partes de 3 bits y 2 partes de 15 bits; Caracteres de 6 bits; y documentación en octal. Las primeras implementaciones de B fueron en un PDP-7 (18 bits) y un Honeywell GE-945 (36 bits, pero con direccionamiento de 18 bits y soporte para bytes de 6 y 9 bits). El PDP-11 de 16 bits salió después de B, por lo que no habría influido mucho en el diseño de B.
8bittree
97

Nota: No sé la respuesta correcta, ¡pero la siguiente es solo mi especulación personal!

Como se ha mencionado un 0 antes de un número significa que es octal:

04524 // octal, leading 0

Imagine la necesidad de crear un sistema para denotar números hexadecimales, y tenga en cuenta que estamos trabajando en un entorno de estilo C. ¿Qué tal terminar con h como ensamblaje? Desafortunadamente no puede, le permitiría crear tokens que son identificadores válidos (por ejemplo, podría nombrar una variable de la misma manera), lo que crearía algunas ambigüedades desagradables.

8000h // hex
FF00h // oops - valid identifier!  Hex or a variable or type named FF00h?

No puedes liderar con un personaje por la misma razón:

xFF00 // also valid identifier

El uso de un hash probablemente se descartó porque entra en conflicto con el preprocesador:

#define ...
#FF00 // invalid preprocessor token?

Al final, por cualquier razón, decidieron poner una x después de un 0 inicial para denotar hexadecimal. No es ambiguo ya que todavía comienza con un carácter numérico, por lo que no puede ser un identificador válido, y probablemente se base en la convención octal de un 0 inicial.

0xFF00 // definitely not an identifier!
AshleysBrain
fuente
3
Interesante. Me imagino que podrían haber usado un 0 Y al final h para denotar hexadecimal. El h final probablemente se habría confundido con el sufijo del especificador de tipo, por ejemplo, 0xFF00l vs 0FF00hl
zdan
2
Este argumento implica que el uso de un cero inicial para denotar números octales es anterior al uso del prefijo hexadecimal "0x". ¿Es esto cierto?
Andreas Rejbrand
1
¿No habrían sido ambos inventados al mismo tiempo? ¿Por qué habría alguna vez uno pero no el otro?
AshleysBrain
AshleysBrain vea la respuesta de @ řrřola para saber por qué podría haber octal pero no hexadecimal al mismo tiempo.
jv42
2
@zdan lo han usado hace mucho tiempo. En el ensamblado Intel x86, un literal hexadecimal siempre debe tener el prefijo 0 si comienzan con un carácter. Por ejemplo, 0xFFAB1234debe escribirse como 0FFAB1234h. Lo recuerdo de Asm en línea en Pascal cuando era joven stackoverflow.com/q/11733731/995714
phuclv
27

Es un prefijo para indicar que el número está en hexadecimal en lugar de en alguna otra base. El lenguaje de programación C lo usa para decirle al compilador.

Ejemplo:

0x6400se traduce en 6*16^3 + 4*16^2 + 0*16^1 +0*16^0 = 25600. Cuando el compilador lee 0x6400, entiende que el número es hexadecimal con la ayuda del término 0x . Por lo general, podemos entender por (6400) 16 o (6400) 8 o lo que sea ...

Para binario sería:

0b00000001

Espero haber ayudado de alguna manera.

¡Buen día!

loyola
fuente
2
Los literales binarios solo se admiten en C ++ desde C ++ 14, y no se admiten en C en absoluto.
Ruslan
1
Esto no explica por qué . En particular, ¿por qué no podrías escribir el primer ejemplo como x6400? El xtodavía podría usarse para inferir hexadecimal.
Aaron Franke el
12

El 0 anterior se usa para indicar un número en la base 2, 8 o 16.

En mi opinión, se eligió 0x para indicar hexadecimal porque 'x' suena como hexadecimal.

Solo mi opinión, pero creo que tiene sentido.

¡Buen día!

Johnny Low
fuente
2
¡Gracias por la respuesta! Entiendo que esta es tu primera publicación en StackOverflow. La respuesta podría haber sido más útil si las opiniones se separan de los hechos.
vivek_ganesan