2011-08-25 24 views
6

Estoy usando C++ en Linux de 64 bits, el compilador (g ++) también es de 64 bits. Cuando imprimo la dirección de alguna variable, por ejemplo un entero, se supone que imprime un entero de 64 bits, pero de hecho imprime un entero de 48 bits.puntero C++ en la máquina de 64 bits

int i; 
cout << &i << endl; 

output: 0x7fff44a09a7c 

Me pregunto dónde están los otros dos bytes. Esperando su ayuda.

Gracias.

+0

¿Cuántos bits hace el número '1' tiene? ¿Te quejas de que 'uint32_t x = 1; 'no tiene suficientes bits? Debería verificar 'sizeof (* int)' en lugar de imprimir cosas. –

Respuesta

7

La impresión de direcciones en la mayoría de las implementaciones de C++ suprime los ceros a la izquierda para hacer que las cosas sean más legibles. Cosas como 0x00000000000013fd realmente no agregan valor.

Cuando uno se pregunta por qué normalmente no se ve nada más que los valores de 48 bits en espacio de usuario, esto se debe a la arquitectura AMD64 actual se acaba de definir tener 48 bits de espacio de direcciones virtuales (como puede verse por ejemplo cat /proc/cpuinfo en Linux)

+0

Este artículo de Wikipedia (sí, lo sé) dice que la definición de arquitectura permite hasta 64 bits, pero las implementaciones actuales solo usan 48. ¿Está mal? http://en.wikipedia.org/wiki/Amd64#Architectural_features – AndrzejJ

+0

@AndrzejJ Bueno, es una arquitectura de "64 bits" y, nominalmente, los punteros son de 64 bits. Es solo que actualmente el espacio de direcciones virtuales de 256TB es más que suficiente y usted ahorra cables (y por lo tanto, potencia) si puede suponer que los 16 bits más altos de cada puntero son cero. – Voo

3

Están ahí, no han ido a ninguna parte, es solo el formato de la transmisión. Salta los ceros a la izquierda (revisa las propiedades de relleno y ancho de la secuencia).

EDITAR: pensándolo bien, no creo que haya una buena forma de cambiar el formato para el operator<< predeterminado para los punteros. Los atributos de relleno y ancho se pueden cambiar si está utilizando el manipulador std::hex.

+0

Entonces, si la dirección de algún objeto es 0x400c10, eso significa que se omiten 5 bytes de ceros a la izquierda, ¿verdad? – cheng

+1

@ user508305 Podría, pero tenga en cuenta que todos los punteros no son necesariamente del mismo tamaño que la capacidad de direccionamiento de la plataforma. –

+0

¿En qué caso tienen diferentes tamaños? ¿Puedes hablar más sobre esto o simplemente darme algunas palabras clave para que pueda googlearlo? – cheng

1

Para la diversión se puede utilizar la salida C y ver si se parece más a lo que está buscando:

printf("0x%p"); 
Cuestiones relacionadas