Portál AbcLinuxu, 13. května 2025 22:14

Dotaz: C++ endian

19.4.2011 22:45 martin
C++ endian
Přečteno: 443×
Odpovědět | Admin
Nazdar,

dnes som sa zacal zaoberat s big endian a little endian. Opisal som program z knihy Profesionalne Linux programovani aplikaci a po skompilovani som dospel k tomu ze mam big endian. To by bolo aj fajn ked ako vystup mi hodilo toto:

0xdeadbeef

[0] = 0xffffffef [1] = 0xffffffbe [2] = 0xffffffad [3] = 0xffffffde

Prikladam zdrojovy kod.

Podla big endian by mal byt vystup skor [0] = 0xffffffde [1] = 0xffffffad [2] = 0xffffffbe [3] = 0xffffffef

Viete mi niekto vysvetlit kde moze byt chyba? Alebo som ja zle pochopil endian ?

Dakujem :)

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

19.4.2011 23:02 ghost
Rozbalit Rozbalit vše Re: C++ endian
Odpovědět | | Sbalit | Link | Blokovat | Admin
"dospel k tomu ze mam big endian" Jak? Mas nejaky "exoticky" hw? Protoze treba procesory kompatibilni s Intel x86 jsou (aspon co je mi znamo) prave LE.
19.4.2011 23:08 martin
Rozbalit Rozbalit vše Re: C++ endian
Odpovědět | | Sbalit | Link | Blokovat | Admin
Konkretne mam CPU E8400 co je 64-bit. A tym padol by mal byt big endian. Lenze mne program vypisal vystup, ktory zodpoveda little endian. Preco ? :D
19.4.2011 23:11 ghost
Rozbalit Rozbalit vše Re: C++ endian
rekl bych, ze problem je v samotne detekci. Ty mas: int little_endian(){ int endian = 1; return (0==((char*)&endian)); } A podle mne by melo byt: int little_endian(){ int endian = 1; return (0==(*(char*)&endian)); }
19.4.2011 23:19 ghost
Rozbalit Rozbalit vše Re: C++ endian
1.Omlouvam se za formatovani.
2.Snad me vetsi znalci C/C++ neukamenuji. Porovnani ((char*)&endian)) == 0 je spatne, protoze ty porovnavas int (hodnotu) s ukazatelem na char. Aby to bylo spravne, tak jej musis dereferencovat: (*(char*)&endian)) == 0
20.4.2011 11:55 Sten
Rozbalit Rozbalit vše Re: C++ endian
Core 2 je x86-64, což je architektura založená na x86 a to je little endian. Bitovost procesoru nemá s endianitou nic společného.
19.4.2011 23:16 martin
Rozbalit Rozbalit vše Re: C++ endian
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahah, mas pravdu mam tam chybu ma to tak byt ako si napisal. No po skompilovani stale to iste, nic sa nezmenilo.
19.4.2011 23:22 ghost
Rozbalit Rozbalit vše Re: C++ endian
musis ted porovnavat s 1, ptz jestli je LE, tak 1 bude prave na zacatku
20.4.2011 00:45 Sten
Rozbalit Rozbalit vše Re: C++ endian
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejjednodušší způsob, jak otestovat endianitu na Linuxu (pokud nechcete používat to makro):
#include <arpa/inet.h>

bool bigEndian = htons(0x1234) == 0x1234;
Funkce htons převádí endianitu z místní na síťovou a síťová endianita je velká. Takže pokud je po převodu číslo nezměněné, počítá stroj ve velkém endiánu.

Co se týče vašeho zdrojáku, má to být takto:
return 1 ==(*reinterpret_cast<char*>(&endian));
Když tam máte 0, testujete big endian, ne little endian (na little endian bude nejméně významný bajt první, což je ten, který obsahuje tu jedničku).

Po přetypování to musíte dereferencovat (operátorem *), jinak porovnáváte ukazatel, ne hodnotu (a ten ukazatel nikdy nebude nullptr).

A je to C++, tak raději používejte přetypování z C++.
20.4.2011 17:15 ghost
Rozbalit Rozbalit vše Re: C++ endian
A je to C++, tak raději používejte přetypování z C++.
V C/C++ nedelam, muzete mi osvetlit v cem se to ve vysledku lisi? Resp. proc je to vyhodnejsi? Jen co do cistoty kodu, ci to ma i jiny vyznam? Diky
clayman avatar 20.4.2011 17:49 clayman | skóre: 13 | Praha 6
Rozbalit Rozbalit vše Re: C++ endian
Za Stena mluvit nemůžu, ale předpokládám, že hlavní výhoda tkví v tom, že používáte knihovní funkci, tzn. praxí ověřenou věc namísto vlastních krkolomných konstrukcí, které mohou být náchylné k chybám. :-)
clayman avatar 20.4.2011 20:06 clayman | skóre: 13 | Praha 6
Rozbalit Rozbalit vše Re: C++ endian
Eh, jsem si měl pořádně přečíst tvůj citát... :-(
20.4.2011 17:58 Sten
Rozbalit Rozbalit vše Re: C++ endian
Význam je hlavně v tom, že explicitně říkáte, co tím přetypováním chcete udělat, jestli chcete odstranit const (const_cast), přetypovat natvrdo (static_cast), dynamicky (dynamic_cast) anebo úplně změnit význam nějakého pointeru (reinterpret_cast) (případně si pak můžete nadefinovat i vlastní přetypovávání, např. v Boostu je hodně dobré lexical_cast, které překládá obsah proměnných), takže pokud tam uděláte chybu (třeba reinterpret_cast zároveň odstraní const), tak to překladač odmítne přeložit.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.