[c] little endian i big endian

C, C++, Java, PHP, Ruby...

Moderator/ica: Moderatori/ce

Pravila foruma
U naslovu teme unutar uglatih zagrada navesti o kojem jeziku je riječ. Primjer: [Java]
Odgovori
Nele
Postovi: 248
Pridružen/a: 07 lip 2009, 12:55
Spol: M

[c] little endian i big endian

Post Postao/la Nele »

Provjera da li procesor koristi little endian ili big endian u c-u:

int x = 1;
if(*(char *)&x == 1)
printf("little-endian\n");
else printf("big-endian\n");

http://c-faq.com/misc/endiantest.html

Nije mi jasan dio *(char *)&x. To znaci uzmi adresu varijable x, uradi type casting u char i od svega toga uzmi vrijednost?
Zbog cega je to 1? Moze mi neko objasniti sta se desava u memoriji?
Avatar
Medojedni jazavac
Postovi: 1536
Pridružen/a: 22 tra 2012, 08:55
Spol: M
OS: eOS Luna
Lokacija: ForHill Croatia
Kontakt:

Re: [c] little endian i big endian

Post Postao/la Medojedni jazavac »

Simpél young padawan:

U zapisu brojeva u memoriji big endian znaci da na prvo mjesto u zapisu dolazi bit najvece tezine, dok u little endian na prvo mjesto dolazi bit najmanje tezine.

Dakle u 8 bitnom zapisu broj jedan bi izgledao ovako:
[*]big endian: 00000001
[*]little endian: 10000000

Sada, u tvom kodu mi zadamo da je varijabla x tipa integer jednaka 1. Integer se uglavnom po defaultu zapisuje u 4 bytea, ponekad u 2, ali uglavnom vise od 1 bytea.

To znaci da bi u little endianu on izgledao ovako:
[*] 10000000.....00000 (32 bita)

A u big endianu ovako:
[*] 00000.....00001 (isto 32 bita samo obrnuto)

Char za razliku od integera ima samo 1 byte.

To znaci da konverzijom

Kod: Označi sve

(char *)&x
mi integer pretvaramo u char tako da od tog integera uzmemo prvih 8 bitova(1 byte) iz memorije.

Dakle iz broja jedan tipa integer cemo uzeti broj tipa char ili

ako je u big endianu:
[*]00000000
ili ako je u little endianu
[*]10000000

Kada je procesor u sustavu little endiana, "10000000" ce biti ekvivaletno broju 1.
stefan je napisao/la:tu mač gemišta
To understand recursion, you must first understand recursion.
Avatar
Medojedni jazavac
Postovi: 1536
Pridružen/a: 22 tra 2012, 08:55
Spol: M
OS: eOS Luna
Lokacija: ForHill Croatia
Kontakt:

Re: [c] little endian i big endian

Post Postao/la Medojedni jazavac »

Ako ti jos nije jasno, bilo mi bude drago crtat tablice i strelice jer obozavam ovaj dio teorije i C-a.
stefan je napisao/la:tu mač gemišta
To understand recursion, you must first understand recursion.
Avatar
jurastublic
Postovi: 1907
Pridružen/a: 16 tra 2011, 08:34
Spol: M
OS: Mint 10 LXDE itd...
Lokacija: i grupa Film

Re: [c] little endian i big endian

Post Postao/la jurastublic »

Medo, mali dodatak. Normalno, poredak bitova u bajtu nema toliko veze - to je više briga elektroničara. Za softveraša je bitan poredak bajtova u memoriji u složenijim tipovima poput int ili long. Znači, recimo da se u 16-bitnom sistemu, int sastoji od dva bajta, npr. hex AA 55. Isti se u RAM memoriju može upisati kao (od niže adrese prema višoj) AA 55 ili kao 55 AA.
Opet, ako imaš 32-bitnu memorijsku sabirnicu, proc može poslati odjednom 32 bita u memoriju, tako da će za AABB5566, razlika biti AABB 5566 naspram 5566 AABB, a može biti i 6655 BBAA ovisno o arhitekturi proca. U normalnoj upotrebi riječi, to je ono na šta se misli kad se kaže endian.
I onaj test Nele, nije univerzalan, te će pogrešno pokazati skoro u svakom slučaju osim x=1. Nažalost, baš zato što endianost nije precizno definirana, moraš poznavati sistem za koji radiš test.
"Hodor bre foobar"
Avatar
Medojedni jazavac
Postovi: 1536
Pridružen/a: 22 tra 2012, 08:55
Spol: M
OS: eOS Luna
Lokacija: ForHill Croatia
Kontakt:

Re: [c] little endian i big endian

Post Postao/la Medojedni jazavac »

Hvala na dodatku. Radujem se kolegiju Arhitektura racunala.
stefan je napisao/la:tu mač gemišta
To understand recursion, you must first understand recursion.
Odgovori