Come verificare se un sistema è big endian o little endian?Come verificare se un sistema è big endian o little endian?
risposta
Se si utilizza .NET: verificare il valore di BitConverter.IsLittleEndian
.
Un altro codice C usando l'unione
union {
int i;
char c[sizeof(int)];
} x;
x.i = 1;
if(x.c[0] == 1)
printf("little-endian\n");
else printf("big-endian\n");
È stessa logica che Belwood utilizzato.
penso che non sia conforme allo standard: puoi leggere il campo solo da un enum che hai scritto per ultimo in un comportamento altrimenti indefinito, o sono errato? I sindacati – worenga
non specificano "giustificare" in standard. Questa non è la soluzione corretta (potrebbe funzionare casualmente in specifici OS/compiller). – jaskmar
Alcuni possono spiegare la logica del programma di cui sopra. Se si inizializza la variabile membro i, con x.1 = 1, allora come x.c [0] si sta rivelando essere 1. Mi manca un punto qui? la mia comprensione è che l'unione prende la memoria del più grande tipo di dati e dipende da che possiamo accedervi. È possibile accedere a un solo membro. Qualsiasi risposta sarà molto apprezzata. –
Una soluzione C++:
namespace sys {
const unsigned one = 1U;
inline bool little_endian()
{
return reinterpret_cast<const char*>(&one) + sizeof(unsigned) - 1;
}
inline bool big_endian()
{
return !little_endian();
}
} // sys
int main()
{
if(sys::little_endian())
std::cout << "little";
}
'reinterpret_cast' non può essere utilizzato all'interno di un'espressione costante. –
@ T.C. Gah! Peccato. Thnx :) – Galik
In Linux, `
static union { char c[4]; unsigned long mylong; } endian_test = { { 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.mylong)
if (ENDIANNESS == 'l') /* little endian */
if (ENDIANNESS == 'b') /* big endian */
come è diverso dalla versione di Neeraj? –
In Python:
from sys import byteorder
print(byteorder)
Mi sento come se fosse la risposta più semplice e migliore, grazie! – mdandr
una battuta con Perl (che dovrebbe essere installato di default su quasi tutti i sistemi):
perl -e 'use Config; print $Config{byteorder}'
Se l'uscita inizia con un 1 (byte meno significativo), è un sistema little-endian. Se l'output inizia con una cifra più alta (byte più significativo), è un sistema big-endian. Consultare la documentazione del modulo Config.
Buona risposta, ma questo fornisce un buon diagramma di ciò che sta succedendo: http://stackoverflow.com/a/12792301/803801 – gsingh2011
Questo è davvero un bel diagramma - grazie per averlo aggiunto. – belwood