La C FAQ tiene algunos ejemplos de máquinas históricas con representaciones NULL 0.
Q: En serio, tiene cualquier máquinas reales no nulos nulos realmente utilizado punteros, o diferentes representaciones para los punteros a diferentes tipos ?
A: La serie Prime 50 utilizó el segmento 07777, offset 0 para el puntero nulo , al menos para PL/I. Los modelos posteriores utilizaron el segmento 0, la compensación 0 para punteros nulos en C, necesitando nuevas instrucciones como TCNP (Prueba C Null Pointer), evidentemente como un complemento para [nota al pie] todos los códigos mal escritos que hicieron suposiciones incorrectas . Anteriormente, las máquinas Prime dirigidas a la palabra también eran notorias por requerir punteros de bytes más grandes (char * 's) que los punteros de palabra (int *' s).
serie The Eclipse MV de datos generales tiene tres formatos arquitectónicamente soportados puntero (Word, bytes, y los punteros bits), dos de los cuales son utilizados por los compiladores de C: Punteros bytes para char * y void *, y la palabra punteros para todo lo demás. Por razones históricas durante la evolución de la línea de MV de 32 bits de la línea Nova de 16 bits, los punteros y punteros de palabra tenían los bits de protección offset, indirecta y de anillo en diferentes lugares de la palabra. Al pasar un formato de puntero no coincidente a una función, se produjeron fallas de protección. Finalmente, el compilador MV C agregó muchas opciones de compatibilidad para probar para tratar con código que tenía errores de discrepancia de tipo de puntero.
Algunos mainframes Honeywell-Bull utilizan el patrón de bits 06000 para (interno) punteros nulos.
La serie CDC Cyber 180 tiene punteros de 48 bits que constan de un anillo, segmento y desplazamiento. La mayoría de los usuarios (en el anillo 11) tienen punteros nulos de 0xB00000000000. Era común en los CDC antiguos: las máquinas de complemento a usan una palabra de todos los bits como un indicador especial para todo tipo de datos, incluyendo direcciones no válidas.
La antigua serie HP 3000 utiliza un esquema de direccionamiento diferente para las direcciones de byte que para las direcciones de palabra; al igual que varias de las máquinas que están por encima de , por lo tanto, utiliza diferentes representaciones para los punteros char * y void * que para otros punteros.
La máquina Symbolics Lisp, una arquitectura etiquetada, ni siquiera tiene punteros numéricos convencionales; usa el par (básicamente, un identificador no existente ) como un puntero nulo C.
Dependiendo del modelo `` memoria '' en uso, los procesadores 8086-familia (PC compatibles) pueden utilizar punteros de 16 bits de datos y de función punteros de 32 bits, o viceversa.
Algunas máquinas de Cray de 64 bits representan int * en los 48 bits más bajos de una palabra ; char * usa adicionalmente algunos de los 16 bits superiores para indicar una dirección de bytes dentro de una palabra.
'NULL' no se expande a una dirección. ¿Realmente está preguntando cuándo se definió la macro 'NULL' a otra cosa, o quiere preguntar cuándo fue la representación subyacente de la constante del puntero nulo no todos los bits cero? – jamesdlin
La última vez que lo vi, podría expandirse a ((nulo *) (3L - 2L - 1L)), ((((0) * 0x55)))), o ('\ 0'). (Eso está en C. Algunos de estos no estarían permitidos en C++.) –
La respuesta que usted aceptó no responde a su pregunta, como se le preguntó. Corrija la pregunta (si eso no es lo que quería preguntar) o vuelva a aceptar otra respuesta. Los detalles están en los comentarios. – AnT