2010-11-15 52 views

Respuesta

57

En C, C++

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

Ver también: Perl version

+9

Buena respuesta, pero esto proporciona un buen diagrama de lo que está sucediendo: http://stackoverflow.com/a/12792301/803801 – gsingh2011

+0

Realmente es un buen diagrama, gracias por agregarlo. – belwood

5

Si está utilizando .NET: verifique el valor de BitConverter.IsLittleEndian.

8

Otro código C utilizando la unión

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"); 

Es misma lógica que Belwood utiliza.

+2

Creo que esto no cumple con las normas: sin embargo, es posible que solo lea el campo de una enumeración que escribió por última vez, ya que de lo contrario es posible un comportamiento indefinido, ¿o estoy equivocado? – worenga

+0

uniones no especifica "justificar" en estándar. Esta no es la solución correcta (puede funcionar accidentalmente en un OS/compilador específico). – jaskmar

+0

¿Pueden algunos explicar la lógica en el programa anterior? Si inicializa la variable miembro i, con x.1 = 1, entonces ¿cómo x.c [0] se está convirtiendo en 1. ¿Me falta algún punto aquí? Entiendo que la unión toma la memoria del tipo de datos más grande y, dependiendo de eso, podemos acceder a él. Solo se puede acceder a un miembro. Cualquier respuesta será muy apreciada –

0

A C solución ++:

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' no se puede usar dentro de una expresión constante. –

+0

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

0

En 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

¿En qué se diferencia de la versión de Neeraj? –

10

En Python:

from sys import byteorder 
print(byteorder) 
+2

Siento que esta es la respuesta más simple y mejor, ¡gracias! – mdandr

0

A de una sola línea con Perl (que debe ser instalado por defecto en casi todos los sistemas):

perl -e 'use Config; print $Config{byteorder}' 

Si la salida comienza con un 1 (byte menos significativo), es un sistema little-endian. Si la salida comienza con un dígito más alto (byte más significativo), es un sistema big-endian. Consulte la documentación del módulo Config.

Cuestiones relacionadas