2010-11-15 18 views

Répondre

57

En C, C++

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

Voir aussi: Perl version

+9

Bonne réponse, mais cela fournit un bon diagramme de ce qui se passe: http://stackoverflow.com/a/12792301/803801 – gsingh2011

+0

C'est vraiment un joli diagramme - merci de l'avoir ajouté. – belwood

5

Si vous utilisez .NET: Vérifiez la valeur de BitConverter.IsLittleEndian.

8

Un autre code C en utilisant l'union

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

Il est même logique que BELWOOD utilisé.

+2

Je pense que ce n'est pas conforme à la norme cependant: vous pouvez seulement lire le champ d'une énumération que vous avez écrit pour un comportement autrement indéfini est possible, ou je me trompe? – worenga

+0

syndicats ne spécifie pas "justifiant" dans la norme. Cette solution n'est pas correcte (elle peut fonctionner accidentellement dans un OS/compilateur spécifique). – jaskmar

+0

Pouvez-vous s'il vous plaît expliquer la logique dans le programme ci-dessus. Si vous initialisez la variable membre i, avec x.1 = 1, alors comment x.c [0] se révèle être 1. Ai-je manqué un point ici? ma compréhension est que l'union prend la mémoire du plus grand type de données et selon ce que nous pouvons y accéder. Un seul membre peut être consulté. Toute réponse sera très appréciée –

0

A C++ solution:

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' ne peut pas être utilisé dans une expression constante. –

+0

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

0

Dans 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 quoi est-ce différent de la version de Neeraj? –

10

En Python:

from sys import byteorder 
print(byteorder) 
+2

Je me sens comme c'est la réponse la plus simple et la meilleure, merci! – mdandr

0

Une seule ligne avec Perl (qui doit être installé par défaut sur presque tous les systèmes):

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

Si la sortie commence par 1 (octet le moins significatif), c'est un système little-endian. Si la sortie commence avec un chiffre plus élevé (octet le plus significatif), c'est un système big-endian. Voir la documentation du module Config.