Float Zahl auseinander nehmen.
-
Ich will alle vier Bytes einer float Zahl in einen vier Bytes großen char array einlesen. Das ist mein Ansatz, nur ich glaub der ist falsch, aber ich weis nicht was.

float zahl=20.1; float *ptr; char a[3]; ptr = &zahl; for (int i=0;i < 4;i++) { a[i]=(char)ptr; ptr++; }
-
dein problem ist, dass ptr bei dir vom typ float* ist und ptr++ daher um sizeof(float) (=4) weiterzählt statt um 1. außerdem is dein array a nur 3 elemente groß statt 4

float zahl = 20.1f; char *ptr = reinterpret_cast<char*>(&zahl); char a[4]; for( int i = 0; i < 4; i++ ) a[i] = *ptr++;alternativ gings auch so:
union { float zahl; char a[4]; } zahl = 20.1f;
-
so ist's doch viel einfacher
float zahl=20.1; char a[sizeof(float)]; *(float*)a = zahl; // <-- keine schleife nötig
-
Gut. Ich wollte nun aus der float Zahl einmal Ziffern, Exponent und Vorzeichen herausfiltern
[ S ][Exponent][mantrissa]
32 31|30 23|22 0http://chrishecker.com/images/f/fb/Gdmfp.pdf
S. 21Ich hab das nun so herausgefiltert, aber das scheint irgendwie falsch zu sein

float zahl=20.1; char *ptr = reinterpret_cast<char*>(&zahl); char a[4]; int b[4],e,s,te; for (int i=0;i < 4;i++) { a[i] = *ptr ; b[i]=a[i]; //sicher stellen, dass 1 Byte Zahl ptr++; } e=a[2]&128; //nur das letzte Bit e =e>> 7; // 7 Bits nach rechts schieben s=a[3]&128; //vorzeichen Bit s=s >> 7; //nur noch 1 oder 0 möglich te=a[3]|128; //100% setzen te=a[3]^128; //Bit wegmachen (xor) te << 1; //mal 2 e = e + te; //end exponentUnd noch eine Frage zusätzlich wie ist die Basis für den Exponent.
-
Hauke schrieb:
Ich hab das nun so herausgefiltert, aber das scheint irgendwie falsch zu sein
benutzt du einen x86-PC?
dort sind die bytes falsch herum gespeichert, d.h. bit 31 ist dort, wo du das bit 7 erwarten würdest.Hauke schrieb:
Und noch eine Frage zusätzlich wie ist die Basis für den Exponent.
2
-
float x = -2.0f;# int xi = *reinterpret_cast<int*>(&x); int s = xi >> 31; int e = (xi << 8) >> 23; int m = xi & 0x803FFFFF;ich würds so in der art versuchen.
-
Das mit den umgedrehten Bytes weis ich, aber ich weis nicht wie c++ das genau verwaltet und wenn ich die Bytes umdrehe gefallen mir die Zahlen noch weniger oder ich interpretiere die werte, die herauskommen falsch.
e=a[1]&128; //nur das letzte Bit vorher 2 e =e>> 7; // 7 Bits nach rechts schieben s=a[0]&128; //vorzeichen Bit vorher 3 s=s >> 7; //nur noch 1 oder 0 möglich te=a[0]|128; //100% setzen vorher 3 //fehler war hier noch drin sonst macht die oberre Zeile kein Sinn te=te^128; //Bit wegmachen (xor) vorher 3 te << 1; //mal 2 e = e + te; //end exponent