Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

endianess met verschillende typen

Pagina: 1
Acties:

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 19-11 07:22
Als je met een int wisselt van endianess dan word 0xab cd omgezet naar 0xcd ab.

Maar hoe zit dat met een float type?

en wat is het verschil bij endianess wissel voor een array of string?
word array[7] gewisseld met array[0] (bij array met 8 elementen)
of word alleen de int die in array[7] zit omgedraait?

Klus page: http://klusthuis.blogspot.com


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-11 11:35

Janoz

Moderator Devschuur®

!litemod

Bij endianess gaat het puur om de volgorde van twee bytes in een word. Het effect op een float is lastig uit te leggen aangezien deze anders opgeslagen wordt, maar voor een array geld gewoon dat de adressering niets veranderd. Het is verder ook erg afhankelijk van de gebruikte taal/compiler. Een array (of string, maar een string is gewoon een array van chars) is namelijk niet een dataformaat dat rechtstreeks door de processor begrepen wordt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Janoz schreef op dinsdag 02 oktober 2007 @ 16:35:
Bij endianess gaat het puur om de volgorde van twee bytes in een word.
Of 4 in een dword, of 8 in een qword, of 10 in een tbyte. Op de gangbare platforms iig, maar het hangt idd altijd van het platform af :)
Het effect op een float is lastig uit te leggen aangezien deze anders opgeslagen wordt
Op de big-endian machines waar wij mee werken (PowerPC architecturen voornamelijk) zijn 4-byte floats en 8-byte doubles ook gewoon geswapped, net als met de ints. Geen idee of de PPC ook de 80-bits double ondersteunt overigens, maar dat is dan waarschijnlijk ook gewoon geswapped.

Wel moet je opletten met bit-fields in C en C++. Het is namelijk in de standaard niet vastgelegd in welke volgorde de bitfields in de elementen staan. Aangezien wij nogal wat packed data gebruiken dat compileerbaar moet zijn voor beide platforms, betekent dat dat we elke struct (over het algemeen gegenereerd uit een data template) in twee volgordes opschrijven, in een #if/#else/#endif preprocessor blok. Best irritant.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 19-11 07:22
Wat we op dit moment doen is typen gebruiken en deze mbv typedef gelijk trekken tegen de juiste typen van het betreffende platform.
bij het verzenden word alles in bytes verzonden...

zo heb ik met
code:
1
2
3
float F = 1; 
char chars[4]; 
memcpy(chars,(void*)&F,4);

een float in chars gezet om te verzenden en aand e andere kane moet het weer naar een float worden gebouwt.

Nou staat er in mijn char-array:
chars[0]: 0x00
chars[1]: 0x00
chars[2]: 0x80
chars[3]: 0x3f

Maar om dit te valideren moet ik eigelijk weten hoe een float intern is gecodeerd (in elk geval op een windows x86 machine), who knows?

Klus page: http://klusthuis.blogspot.com


  • Icelus
  • Registratie: Januari 2004
  • Niet online
liquid_ice schreef op woensdag 03 oktober 2007 @ 09:14:
Maar om dit te valideren moet ik eigelijk weten hoe een float intern is gecodeerd (in elk geval op een windows x86 machine), who knows?
De x86 gebruikt IEEE754 floating point-getallen. Een float komt met het 32-bit type overeen en double met het 64-bit type.

Developer Accused Of Unreadable Code Refuses To Comment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Over het algemeen komt de float 1.f op elk 32 bits platform wel overeen met de int 0x3f800000

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1