000
18.10.2004, 13:15 Uhr
Hans
Library Walker (Operator)
|
Hi,
ich hab mir bezüglich des Endianproblems bei der Bitbetrachtung von Daten mal so ein paar Gedanken gemacht. Dabei kam ich auf folgende Idee (s.u.), um das Problem zu lösen. Die Frage ist nur, ob das Ding auch so funktioniert. Bei mir auf dem Intel-Prozessor läuft es, aber wie sieht es auf 'nem Motorola-Prozessor aus?
C++: |
#include <stdio.h>
union Zahl { int I; long L; float F; double D; long double LD; char c[sizeof(long double)]; } Z;
void zahlaus();
int main(int argc, char **argv) { int i; int flag;
for (i=0; i<=sizeof(long double); i++) Z.c[i] = '\0';
Z.I = 65536;
if (sizeof(int)==2) /* Test für 16 Bit System */ { if(Z.c[1]==1) flag = 0; /* flag = 0 => Little Endian */ else flag = 1; /* flag = 1 => Big Endian */ } else if (sizeof(int)==4) /* Test für 32 Bit System */ { if(Z.c[1]==1) flag = 0; else flag = 1; }
Z.I = 1; printf ("Z.I = %d\t", Z.I); zahlaus(); printf ("\n");
Z.I = 65536; printf ("Z.I = %d\t", Z.I); zahlaus(); printf ("\n");
Z.LD = -1.0; printf ("Z.LD = %4.2Lf\t", Z.LD); zahlaus(); printf ("\n");
for (i=0; i<=sizeof(long double); i++) Z.c[i] = 0xff; printf ("Z.LD = %Lf\t", Z.LD); zahlaus(); printf ("\n");
printf ("System arbeitet mit %s-Endian Byte-order.\n", flag ? "little" : "big");
return 0; }
void zahlaus() { int i;
for (i=0; i<=sizeof(long double)+1; i++) { if (i%4 == 0) printf (" "); printf ("%02x ", Z.c[i]&255); /* Ausgabe auf 8 bit beschränken. Das x ist ja für int, und da eine implizite Typenkonvertieung vorgenommen wird, werden 32Bit, bzw. 8 Hex-ziffern ausgegeben wenn ein int grösser als 255 ist. */ } return; }
|
Die Ausgabe sieht bei mir so aus:
Code: |
D:\borland\CBuilder\Projects>byteordertest Z.I = 1 01 00 00 00 00 00 00 00 00 00 00 00 Z.I = 65536 00 00 01 00 00 00 00 00 00 00 00 00 Z.LD = -1.00 00 00 00 00 00 00 00 80 ff bf 00 00 Z.LD = -NAN ff ff ff ff ff ff ff ff ff ff ff 00 System arbeitet mit little-Endian Byte-order.
|
Wäre gut, wenn mal jemand die Ausgabe eines PowerPC, oder sonstigen Rechners der mit Motorola-CPU arbeitet hier posten könnte.
Hans -- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. |