Eventuali duplicati:
Detecting endianness programmatically in a C++ programCome posso trovare l'endianità del mio PC usando C?
C'è qualche funzione di libreria a disposizione per trovare l'endian-ness del mio PC?
Eventuali duplicati:
Detecting endianness programmatically in a C++ programCome posso trovare l'endianità del mio PC usando C?
C'è qualche funzione di libreria a disposizione per trovare l'endian-ness del mio PC?
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");
}
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.
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).
Perché non 'u.i = 1; return u.b [0] == 1? LittleEndian: BigEndian; '? In questo modo non devi preoccuparti della dimensione int. –
@ MartinBonner: anche questo funzionerebbe. –
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");
Non hai bisogno di "else if" - "else" è sufficiente se non è piccola endianess è grande endianess. – Artur
@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). –
forse spiega perché questo funziona come @Eric J. fa sotto – bjackfly
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
@hasanatkazmi Come fai a sapere se il computer memorizzerà il numero in 2 byte o 4 byte? Inoltre, perché stai usando 7 bit comunque? –