2010-11-15 12 views

cevap

57

, C++

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

bakınız: Perl version

+9

İyi bir yanıt, ancak bu neler olup bittiğini güzel bir şekilde gösterir: http://stackoverflow.com/a/12792301/803801 – gsingh2011

+0

Gerçekten güzel bir diyagramdır - eklediğiniz için teşekkürler. – belwood

5

.NET kullanıyorsanız: BitConverter.IsLittleEndian değerini kontrol edin. Ayrıca C

8

Başka C kodu kullanarak birlik

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

Kullanılan BELWOOD aynı mantık.

+2

Bunun standart olarak uyumlu olmadığını düşünüyorum: sadece alanı en son yazdığınız tanımlanmış bir davranıştan okuyamazsınız, aksi halde yanlış tanımlanmış olabilirsiniz, yoksa yanılıyor muyum? – worenga

+0

sendikaları, standartta "haklı" belirtmez. Bu doğru bir çözüm değildir (belirli bir OS/Compiller'da yanlışlıkla çalışabilir). – jaskmar

+0

Bazıları yukarıdaki programdaki mantığı açıklayabilir. Eğer üye değişkeni i, x.1 = 1 ile başlatıyorsa, x.c [0] 'nın nasıl 1 olduğu ortaya çıkıyor. Burada bir noktayı kaçırıyor muyum? Benim anlayışım, sendikanın en büyük veri türünün belleğini alması ve ona erişebildiğimize bağlı olmasıdır. Sadece bir üyeye erişilebilir. Sendikanın en büyük veri türünün hafızasını aldığına ve ona erişebildiğimize bağlı olarak, herhangi bir yanıt, –

0

C++ çözeltisi: Linux

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', sabit bir ifadenin içinde kullanılamaz. –

+0

@ T.C. Gah! Çok kötü. Thnx :) – Galik

0

, `Python'da

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

Neeraj'ın versiyonundan farkı nedir? –

10

:

from sys import byteorder 
print(byteorder) 
+2

Bunun en basit ve en iyi cevap olduğunu düşünüyorum, teşekkürler! – mdandr

0

varsayılan olarak monte edilmelidir Perl ile tek astar (hemen hemen tüm sistemler):

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

Çıktı 1 (en az anlamlı bayt) ile başlıyorsa, bu küçük-endian sistemidir. Çıkış daha yüksek bir rakamla başlarsa (en anlamlı bayt), bu büyük bir endian sistemdir. Config modülünün belgelerine bakın.

İlgili konular