2010-04-19 258 views
299

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

+5

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 en el 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". –

+20

Para ser pedante, también se podría interpretar la pregunta en el título de dos maneras diferentes: 1) "¿Por qué los números hexadecimales tienen el prefijo 0x, a diferencia 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" es también un número hexadecimal. –

+1

He editado la pregunta para reflejar la primera interpretación. Y también para arreglar el inglés :) –

Respuesta

324

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

historia larga: En los años 60, los sistemas de números de programación prevalentes fueron decimal y octal - mainframes tenían 12, 24 o 36 bits por byte, que es bien divisible por 3 = log2 (8).

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

  1. una constante entera ahora siempre se compone de una única manera,
  2. el analizador todavía puede decir de inmediato que tiene una constante,
  3. el analizador puede decir inmediatamente la base (0 es la misma en ambas bases),
  4. es matemáticamente cuerdo (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 seguían siendo válidos.Dado que aún se necesitaban octals para otras máquinas, se eligió arbitrariamente 0x (00 probablemente se descartó como incómodo).

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

+76

No creo que '0x' en lugar de' 00' sea preferencia/incomodidad. '00' rompería el código existente. '0010' como octal es' 8', mientras que '0010' como hexadecimal sería' 16'. No podían usar ningún número como un indicador de segundo dígito (excepto '8' o' 9', y ninguno tiene ningún significado relacionado con el hexadecimal) por lo que una letra es imprescindible. Y eso deja ya sea '0h' o' 0x' (** H ** e ** X ** idecimal). Desde este punto, parece que realmente ha vuelto a las preferencias. – GManNickG

+1

Relacionados: http://stackoverflow.com/questions/18987911/bcpl-octal-numerical-constants y http://stackoverflow.com/questions/11483216/why-are-leading-zeroes-used-to-represent-octal -numbers –

+15

El uso de un prefijo '0' para octal ha causado tantos problemas a lo largo de los años. Notablemente en países como el Reino Unido donde los números de teléfono comienzan con un '0'. Javascript y muchos otros lenguajes analizarían esto como octal, destruyendo el número antes de almacenarlo. Para agregar a la diversión, un producto de base de datos popular cambiaría _silently_ a un análisis decimal si el número contenía un '8' o' 9'. – Basic

84

Nota: No sé la respuesta correcta, pero lo que sigue es solo mi especulación personal.

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

04524 // octal, leading 0 

imaginar que necesitan para llegar a un sistema para denotar números hexadecimales, y tenga en cuenta que estamos trabajando en un ambiente de estilo C. ¿Qué tal terminar con h como ensamblaje? Desafortunadamente no puedes, te permitiría crear tokens que son identificadores válidos (por ejemplo, podrías 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 se puede conducir con un carácter por la misma razón:

xFF00 // also valid identifier 

El uso de un hash fue probablemente expulsados ​​porque entra en conflicto con el preprocesador:

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

En el final, por la razón que sea, decidieron poner una x después de un 0 inicial para denotar hexadecimal. Es ambigua ya que todavía se inicia con un carácter número por lo que no puede ser un identificador válido, y se basa probablemente fuera de la convención octal de un líder 0.

0xFF00 // definitely not an identifier! 
+2

Interesante. Imagino que podrían haber usado un 0 y un h al principio para denotar el hex. La h posterior probablemente se habría confundido con el sufijo de especificador de tipo, p. 0xFF00l vs 0FF00hl – zdan

+1

Este argumento implica que el uso de un cero inicial para indicar números octales es anterior al uso del prefijo hexadecimal "0x". ¿Es esto cierto? –

+1

¿No habrían sido ambos inventados al mismo tiempo? ¿Por qué habría uno pero no el otro? – AshleysBrain

16

SIMPLE

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

Ejemplo:

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

Para binario será

0b00000001

Esperanza ayudado de alguna manera.

día Bueno,

+0

Los literales binarios solo se admiten en C++ desde C++ 14 y no son compatibles en absoluto con C. – Ruslan

0

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

En mi opinión, 0x fue elegido para indicar hexagonal porque los sonidos 'x' como el hex.

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

¡Buen día!

+1

¡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 están separadas de los hechos. –

Cuestiones relacionadas