2011-12-20 10 views

cevap

47

Böyle bir kitaplığa sahip olmanız için neden kütüphaneye ihtiyacınız var? :)

int num = 1; 

if (*(char *)&num == 1) 
{ 
    printf("Little-Endian\n"); 
} 
else 
{ 
    printf("Big-Endian\n"); 
} 
+0

belki de bunun neden @Eric J.'nin – bjackfly

+9

int num = 1 gibi çalıştığı açıklanırsa, endianiteye bağlı olarak 000.0001 veya 100.000 olarak depolanır. (char *) & num, bu int'nin ilk baytına işaret eder. şimdi bu bayt 1 okursa, o zaman onun küçük endian aksi takdirde büyük endian. – hasanatkazmi

+1

@hasanatkazmi Bilgisayarın sayıyı 2 bayt veya 4 bayta mı saklayacağını nereden biliyorsunuz? Ayrıca, neden 7 bit kullanıyorsunuz? –

5

Kitaplık işlevinin farkında değilim.

Bir tamsayı adresi alabilir, sonra bu adresi bir karakter işaretçisi olarak ele alabilir ve veriyi tamsayıyı içeren baytlara yazabilirsiniz. Daha sonra, tamsayıda olanı okuyun ve büyük bir endian veya küçük bir endian mimarisiyle tutarlı bir sonuç elde edip edemeyeceğinizi görün.

1

Bunu yapmak için standart bir işlev yoktur (C standardında veya POSIX standardında olduğu gibi).

PC'niz Intel çalıştıran bir (Windows stili) PC ​​ise, bu küçük endian.

Makinenizde bayt sırasını bulmak isterseniz, tamamen tanımlanmamış bir davranışı kullanabilirsiniz (ancak genellikle işe yaramaz - çalışılmadığı herhangi bir yerde duymadım):

enum { BigEndian, LittleEndian }; 

int endianness(void) 
{ 
    union 
    { 
     int i; 
     char b[sizeof(int)]; 
    } u; 
    u.i = 0x01020304; 
    return (u.b[0] == 0x01) ? BigEndian : LittleEndian; 
} 

Bu kod 32 bit int türünde (64 bit veya 16 bit yerine) olduğunu varsayar.

+0

neden 'u.i = 1; geri dönüş u.b [0] == 1? LittleEndian: BigEndian; '? Bu şekilde int boyutu hakkında endişelenmenize gerek yok. –

+0

@MartinBonner: Bu da işe yarayacak. –

5

kullanımı bu kod:

union 
{ 
    uint8 c[4]; 
    uint32 i; 
} u; 

u.i = 0x01020304; 

if (0x04 == u.c[0]) 
    printf("Little endian\n"); 
else if (0x01 == u.c[0]) 
    printf("Big endian\n"); 
+0

"else if" - "else" kelimesine ihtiyacınız yok. eğer küçük bir endianess değilse, bu büyük bir endianess. – Artur

+2

@Artur: ha ha ha ha! Başka alternatifler de var: PDP11, büyük-ender düzende 16 bitlik kelimeler kullanmıştı ... ... küçük-ender düzenindeki kelime baytları ile (visa-versa olabilirdi - bir süre önceydi). –

İlgili konular