2010-11-15 3 views

risposta

57

In C, C++

int n = 1; 
// little endian if true 
if(*(char *)&n == 1) {...} 

Vedi anche: Perl version

+9

Buona risposta, ma questo fornisce un buon diagramma di ciò che sta succedendo: http://stackoverflow.com/a/12792301/803801 – gsingh2011

+0

Questo è davvero un bel diagramma - grazie per averlo aggiunto. – belwood

5

Se si utilizza .NET: verificare il valore di BitConverter.IsLittleEndian.

8

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.

+2

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

+0

non specificano "giustificare" in standard. Questa non è la soluzione corretta (potrebbe funzionare casualmente in specifici OS/compiller). – jaskmar

+0

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. –

0

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"; 
} 
+0

'reinterpret_cast' non può essere utilizzato all'interno di un'espressione costante. –

+0

@ T.C. Gah! Peccato. Thnx :) – Galik

0

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 */ 
+0

come è diverso dalla versione di Neeraj? –

10

In Python:

from sys import byteorder 
print(byteorder) 
+2

Mi sento come se fosse la risposta più semplice e migliore, grazie! – mdandr

0

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.