C, el antepasado de C++ y Java, fue desarrollado originalmente por Dennis Richie en PDP-8 a principios de los 70. Esas máquinas tenían un 12-bit address space, por lo que los punteros (direcciones) tenían 12 bits de longitud y se representaban más convenientemente en código mediante tres dígitos octales de 4 bits (la primera palabra direccionable sería 000octal, la última palabra direccionable 777octal).
Octal no se asigna bien a los bytes de 8 bits porque cada dígito octal representa tres bits, por lo que siempre habrá bits en exceso representables en la notación octal. Un byte de bits totalmente TRUE (1111 1111) es 377 en octal, pero FF en hexadecimal.
Hex es más fácil para la mayoría de las personas convertir en binario en sus cabezas, ya que los números binarios generalmente se expresan en bloques de ocho (porque es del tamaño de un byte) y ocho son exactamente dos dígitos hexadecimales, pero la nota hexadecimal habría sido torpe y engañoso en el tiempo de Dennis (lo que implica la capacidad de abordar 16 bits). Los programadores necesitan pensar en binario cuando trabajan con hardware (para lo cual cada bit típicamente representa un cable físico) y cuando se trabaja con lógica bit-wise (para lo cual cada bit tiene un significado definido por el programador).
Imagino que Dennis agregó el prefijo 0 como la variación más simple posible en los números decimales diarios, y lo más fácil para los primeros analizadores sintácticos para distinguir.
Creo que la notación hexadecimal 0x__ se agregó a C un poco más tarde. El árbol de análisis sintáctico del compilador para distinguir 1-9 (primer dígito de una constante decimal), 0 (primer dígito [insignificante] de una constante octal), y 0x (que indica una constante hexadecimal a seguir en los dígitos subsiguientes) entre sí es considerablemente más más complicado que usar un 0 como indicador para pasar de analizar los dígitos subsiguientes como octal en lugar de decimal.
¿Por qué diseñó Dennis de esta manera? Contemporary programmers no aprecian que esas computadoras primitivas a menudo se controlaron alternar las instrucciones a la CPU al activar físicamente los interruptores en el panel frontal de la CPU, o con una tarjeta perforada o cinta de papel; todos los entornos en los que guardar algunos pasos o instrucciones representaban ahorros significativos de mano de obra. Además, la memoria era limitada y costosa, por lo que guardar incluso algunas instrucciones tenía un alto valor.
En resumen: 0 para octal porque era eficiente analizable y octal era fácil de manejar en PDP-8 (al menos para la manipulación de direcciones)
0x para hexagonal probablemente porque era compatible con versiones anteriores de forma natural y extensión en el estándar de prefijo octal y aún relativamente eficiente para analizar.
Tengo que amar a alguien que habla de C++ como su historia antigua. –
No están presentes en BCPL o B. –
Venía de C, no de C++. C++ simplemente lo mantuvo, ya que Stroustrup no quería introducir incompatibilidades innecesarias entre C y C++. –