2011-12-20 9 views

risposta

47

Perché hai bisogno di una biblioteca se la trovi così? :)

int num = 1; 

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

forse spiega perché questo funziona come @Eric J. fa sotto – bjackfly

+9

int num = 1 verrà memorizzato come 000.0001 o 100.000 a seconda di endianness. (char *) & num punta al primo byte di quell'int. ora se quel byte legge 1, allora il suo piccolo endian altrimenti big endian. – hasanatkazmi

+1

@hasanatkazmi Come fai a sapere se il computer memorizzerà il numero in 2 byte o 4 byte? Inoltre, perché stai usando 7 bit comunque? –

5

Non sono a conoscenza di una funzione di libreria.

È possibile ottenere l'indirizzo di un numero intero, quindi trattare quell'indirizzo come un puntatore di carattere e scrivere i dati nei byte che comprendono l'intero. Quindi, leggi cosa contiene effettivamente l'intero e vedi se ottieni un risultato coerente con un'architettura big endian o little endian.

1

Non c'è una funzione standard per farlo (come in standard C o standard POSIX).

Se il PC è un PC (Windows) con Intel, è little-endian.

Se si desidera trovare l'ordine dei byte sul proprio computer, è possibile utilizzare il comportamento non del tutto definito (ma di solito funziona - Non ho sentito da nessuna parte che non funziona) di questa tecnica:

enum { BigEndian, LittleEndian }; 

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

Questo codice presuppone un tipo a 32 bit int (anziché a 64 bit oa 16 bit).

+0

Perché non 'u.i = 1; return u.b [0] == 1? LittleEndian: BigEndian; '? In questo modo non devi preoccuparti della dimensione int. –

+0

@ MartinBonner: anche questo funzionerebbe. –

5

uso di questo codice:

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

Non hai bisogno di "else if" - "else" è sufficiente se non è piccola endianess è grande endianess. – Artur

+2

@Artur: ah ah ah ah! Ci sono altre alternative: PDP11 ha usato parole di 16 bit in ordine big-endian ... con i byte nella parola in ordine little-endian (potrebbe essere stato visa-versa - era qualche tempo fa ora). –

Problemi correlati