2012-08-16 17 views
11

si tengo el siguiente código:¿Apunta el puntero al LSB o al MSB?

int i = 5; 
void * ptr = &i; 
printf("%p", ptr); 

Voy a recibir el LSB de la dirección i, o el MSB?
¿Actuará de manera diferente entre plataformas?
¿Hay alguna diferencia aquí entre C y C++?

+5

Es un comportamiento indefinido ** **. La única forma de imprimir 'ptr' es con'% p', o convirtiéndolo a 'intptr_t' y usando la macro de formato de impresión correspondiente. –

+1

¿No se trata de endianness? –

Respuesta

15

considerar el tamaño de int es de 4 bytes. Siempre &i le dará la primera dirección de esos 4 bytes.

Si la arquitectura es poco endian, entonces la dirección inferior tendrá el LSB como a continuación.

 
     +------+------+------+------+ 
Address | 1000 | 1001 | 1002 | 1003 | 
     +------+------+------+------+ 
Value | 5 | 0 | 0 | 0 | 
     +------+------+------+------+ 

Si la arquitectura es big endian, la dirección inferior tendrá el MSB como a continuación.

 
     +------+------+------+------+ 
Address | 1000 | 1001 | 1002 | 1003 | 
     +------+------+------+------+ 
Value | 0 | 0 | 0 | 5 | 
     +------+------+------+------+ 

Así &i dará LSB dirección de i si little endian o dará MSB dirección de i si big endian

En el modo endian mixta también, ya sea pequeña o grande endian se elegirá para cada tarea dinamicamente.

A continuación voluntad lógica le dice que el endianess

int i = 5; 
void * ptr = &i; 
char * ch = (char *) ptr; 

printf("%p", ptr); 
if (5 == (*ch)) 
    printf("\nlittle endian\n"); 
else 
    printf("\nbig endian\n"); 

Este comportamiento será el mismo para ambos c y c++

8

¿Obtendré la dirección LSB de i, o la MSB?

Esto depende de la plataforma: será la más baja dirigida bytes, que puede ser MSB o LSB dependiendo de endianness de su plataforma.

Aunque esto no está escrito en la norma directamente, esto es lo que está implícito en la sección 6.3.2.3.7:

Cuando un puntero a un objeto se convierte en un puntero a un tipo de carácter, el resultado apunta al byte más bajo direccionado del objeto.


¿Va a actuar de manera diferente entre las plataformas?


¿Hay una diferencia aquí entre C y C++?

No: es dependiente de la plataforma, tanto en C y C++

+0

Aunque estoy casi seguro de que esto es correcto, ¿puede proporcionar una referencia para estas afirmaciones? – amit

+0

@amit No encontré una confirmación directa, pero el estándar dice "el byte más bajo direccionado" en la sección donde se habla sobre la conversión al puntero 'char'. – dasblinkenlight

+0

Gracias por su esfuerzo de todos modos. – amit

5

ptr almacena la dirección del byte de partida del objeto entero. Si esto es donde se almacena el byte más o menos significativo depende de su plataforma. Algunas plataformas raras incluso usan endiancias mixtas, en cuyo caso no será el MSB ni el LSB.

No hay diferencia entre C y C++ en ese sentido.

8

Depende del endianness de la plataforma; si se trata de una plataforma little-endian, obtendrás un puntero al LSB, si se trata de una plataforma big-endian apuntará al MSB. Incluso hay algunas plataformas mixto-endian, en ese caso que Dios tenga misericordia de tu alma verifica la documentación específica de tu compilador/CPU.

Sin embargo, puede realizar una comprobación rápida en tiempo de ejecución:

uint32_t i=0x01020304; 
char le[4]={4, 3, 2, 1}; 
char be[4]={1, 2, 3, 4}; 
if(memcmp(&i, le, 4)==0) 
    puts("Little endian"); 
else if(memcmp(&i, be, 4)==0) 
    puts("Big endian"); 
else 
    puts("Mixed endian"); 

Por cierto, para imprimir punteros debe utilizar el marcador de posición %p, no %d.

+0

Por favor aclare mi pequeña duda. Según mi conocimiento, el sistema mixto endian elegirá ya sea little o big endian para cada tarea. Por favor, dime cuál es el uso de else case en tu porgrama. Si mi comprensión sobre mixto endian es incorrecta? – rashok

+0

"Mixed endian" es un término utilizado para arquitecturas en las que el orden de bytes no es el canónico big-endian o little-endian (consulte algunos ejemplos en wikipedia); mi código simplemente verifica si la representación de la memoria de ese entero de 32 bits coincide con la esperada para los sistemas big-endian o little-endian, si no coincide, no investiga más y solo dice que es endian mixta. –

3

Lo que señala es MSB para mi VC++ 2010 y Digital Mars. Pero está relacionado con la endianidad.

Las respuestas de esta pregunta brindan información para usted: Detecting endianness programmatically in a C++ program.

Aquí, el usuario "ninguno" dice:

#define BIG_ENDIAN  0 
#define LITTLE_ENDIAN 1 
int TestByteOrder() 
{ 
    short int word = 0x0001; 
    char *byte = (char *) &word; 
    return(byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN); 
} 

Esto da algo de información endianness

1

así me sale el LSB de la dirección i, o el MSB?

Depende de la máquina y el sistema operativo. En las máquinas de Big Endian y OS obtendrás el MSB y en las pequeñas máquinas Endian y OS obtendrás el LSB.

Windows siempre es poco endian. Todos (¿la mayoría?) Los sabores de Linux/Unix en x86 son poco endian. Linux/Unix en máquinas Motorola es Big Endian. Mac OS en máquinas x86 es little endian. En las máquinas PowerPC es Big Endian.

¿funciona bien de manera diferente entre plataformas? Sí lo hará.

¿hay alguna diferencia entre c y C++? Probablemente no.

Cuestiones relacionadas