2011-12-20 8 views

Respuesta

47

¿Por qué necesita una biblioteca si puede encontrarla así? :)

int num = 1; 

if (*(char *)&num == 1) 
{ 
    printf("Little-Endian\n"); 
} 
else 
{ 
    printf("Big-Endian\n"); 
} 
+0

quizás explique por qué esto funciona como @Eric J. lo hace por debajo de – bjackfly

+9

int num = 1 se almacenará como 000,0001 o 100.000 dependiendo del endianness. (char *) & num estará apuntando al primer byte de ese int. ahora si ese byte dice 1, entonces su pequeño endian es un gran endian. – hasanatkazmi

+1

@hasanatkazmi ¿Cómo sabes si la computadora almacenará el número en 2 bytes o 4 bytes? Además, ¿por qué estás usando 7 bits de todos modos? –

5

No conozco una función de biblioteca.

Puede obtener la dirección de un entero, luego tratar esa dirección como un puntero de carácter y escribir datos en los bytes que componen el entero. Luego, lea lo que en realidad está en el número entero y vea si obtiene un resultado consistente con una arquitectura endian grande o little endian.

1

No hay una función estándar para hacerlo (como en C estándar, o estándar POSIX).

Si su PC es una PC (con Windows) que ejecuta Intel, es little-endian.

Si desea encontrar el orden de bytes en su máquina, puede utilizar el comportamiento no completamente definido (pero generalmente funciona - No he oído hablar de ningún lado que no funcione) de esta técnica:

enum { BigEndian, LittleEndian }; 

int endianness(void) 
{ 
    union 
    { 
     int i; 
     char b[sizeof(int)]; 
    } u; 
    u.i = 0x01020304; 
    return (u.b[0] == 0x01) ? BigEndian : LittleEndian; 
} 

Este código supone un tipo de 32 bits int (en lugar de 64 bits o 16 bits).

+0

'¿Por qué no U.I. = 1; devolver u.b [0] == 1? LittleEndian: BigEndian; '? De esta manera, no tiene que preocuparse por el tamaño int. –

+0

@MartinBonner: eso también funcionaría. –

5

uso este código:

union 
{ 
    uint8 c[4]; 
    uint32 i; 
} u; 

u.i = 0x01020304; 

if (0x04 == u.c[0]) 
    printf("Little endian\n"); 
else if (0x01 == u.c[0]) 
    printf("Big endian\n"); 
+0

No necesitas "else if" - "else" es suficiente ya si no es poca endianess es una gran endianess. – Artur

+2

@Artur: ja, ja, ja, ja! Hay otras alternativas: PDP11 usó palabras de 16 bits en orden big-endian ... con los bytes en la palabra en orden little-endian (podría haber sido viceversa, fue hace un tiempo). –

Cuestiones relacionadas