Bitmuster interpretieren
Von: Robert Hartmann (robert_hartmann@gmx.net) [Profil]
Datum: 09.10.2009 15:08
Message-ID: <4ACF35E7.6040904@gmx.net>
Newsgroup: de.comp.lang.c
Datum: 09.10.2009 15:08
Message-ID: <4ACF35E7.6040904@gmx.net>
Newsgroup: de.comp.lang.c
Hallo zusammen,
bibt es die Möglichkeit standardkonform und damit
mehr oder weniger compilerübergreifend ein und das Selbe
Bitmuster der Länge 1Byte sowohl als
char, short int, unsigned short int, long int, unsigned long int,
aber auch als float und double interpretiert auszugeben?
Wie sieht es bei folgender Einschränkung aus:
Das Bitmuster eines long int (mit 4 Bytes) soll als
Bitmuster eines float (mit 4 Bytes) interpretiert werden.
Ich persönlich hätte es primitiv so gemacht:
#include <stdio.h>
#include <limits.h>
int main(){
if ((sizeof(float)==4)&&(sizeof(long int) == sizeof(float)))
{
/*Führende Nullen im Bitmuster mal weggelassen: 1111001*/
long int bitmuster = 0xF1;
printf("Das Bitmuster ganzahlig mit Vorzeichen: %ld \n", bitmuster);
printf("Das Bitmuster als Fliesskommazahl: %f \n", bitmuster);
printf("Das Bitmuster als Fliesskommazahl, exp. Schreibweise: %E
\n", bitmuster);
printf("Mit Cast waere Fliesskommazahl: %f \n", (float)bitmuster);
printf("Mit Cast als Fliesskommazahl, exp. Schreibweise: %E \n",
(float)bitmuster);
}
else{
printf("Leider Typgroessen anders als erwartet.\n");
}
return 0;
}
Nach den Antworten zum Threat "printf und Wechselwirkung mit fehlendem
cast" (beginnend mit Message-ID: <4ACDF88F.9010405@gmx.net> ) ist
die obige primitive Lösung nicht immer durchführbar, insbesondere dann
nicht, wenn mit mehreren Variablen nacheinander dasselbe Spiel gemacht wird.
Natürlich könnte ich eine union anlegen,
so dass sich ein long int und ein float (bei gleicher Größe)
einen Speicherbereich teilen. Aber dann muss ich bei der
printf-Anweisung auch zwischen den Namen wählen.
Was für eine erste Übung mit Leuten, die noch nie
Programmiert haben, evtl deutlich über dem Level ist.
Die Lösung mit Union sähe bei mir so aus:
#include <stdio.h>
#include <limits.h>
int main(){
if ((sizeof(float)==4)&&(sizeof(long int) == sizeof(float)))
{
union {
long int a;
float b;
} bitmuster;
/*Führende Nullen im Bitmuster mal weggelassen: 1111001*/
bitmuster.a = 0xF1;
printf("Das Bitmuster ganzahlig mit Vorzeichen: %ld \n", bitmuster.a);
printf("Das Bitmuster als Fliesskommazahl: %f \n", bitmuster.b);
printf("Das Bitmuster als Fliesskommazahl, exp. Schreibweise: %E
\n", bitmuster.b);
printf("Mit Cast waere Fliesskommazahl: %f \n", (float)bitmuster.a);
printf("Mit Cast als Fliesskommazahl, exp. Schreibweise: %E \n",
(float)bitmuster.a);
}
else{
printf("Leider Typgroessen anders als erwartet.\n");
}
return 0;
}
Gruß Robert
[ Auf dieses Posting antworten ]Antworten
- Stefan Reuther (09.10.2009 19:34)
