En una computadora con arquitectura segmentada , un puntero lejano es un puntero a la memoria en un contexto específico, [1] como un selector de segmento que permite apuntar a direcciones fuera del segmento predeterminado.
La comparación y la aritmética en punteros lejanos es problemática: puede haber varios pares de direcciones de desplazamiento de segmento diferentes que apunten a una dirección física .
Por ejemplo, en un Intel 8086 , así como en procesadores posteriores que ejecutan código de 16 bits , un puntero lejano tiene dos partes: un valor de segmento de 16 bits y un valor de desplazamiento de 16 bits . Una dirección lineal se obtiene desplazando el valor del segmento binario cuatro veces hacia la izquierda y luego sumando el valor de desplazamiento. Por lo tanto, la dirección efectiva es de 20 bits (en realidad, de 21 bits, [ ¿cuáles? ] , lo que llevó a la dirección envolvente y a la Puerta A20 ). [ se necesita aclaración ] Puede haber hasta 4096 pares de direcciones de desplazamiento de segmento diferentes que apunten a una dirección física. Para comparar dos punteros lejanos, primero se deben convertir (normalizar) a su representación lineal de 20 bits.
En los compiladores de C destinados a la familia de procesadores 8086, los punteros lejanos se declararon utilizando un calificador no estándar ; por ejemplo, definió un puntero lejano a un carácter . La dificultad de normalizar los punteros lejanos podría evitarse con el calificador no estándar . En otros compiladores se hizo utilizando un calificador igualmente no estándar. [2]far
char far *p;
huge
__far
Ejemplo de puntero lejano:
#include <stdio.h> int main () { char lejos * p = ( char lejos * ) 0x55550005 ; char lejos * q = ( char lejos * ) 0x53332225 ; * p = 80 ; ( * p ) ++ ; printf ( "%d" , * q ); devolver 0 ; }
p
es: 0x5555 * 0x10 + 0x0005 = 0x55555q
es: 0x5333 * 0x10 + 0x2225 = 0x55555p
ambos q
apuntan a la misma ubicación 0x55555.