- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Ersten 8 bit einer 32 bit Zahl auslesen

  1. #11
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Anzeige

    Powerstation Test
    Weil Unions nicht dafür gemacht sind, "a" reinzustecken und "b" rauszuholen.
    Naja auf jeden Fall funktioniert es.

    Wenn du castest brauchst du auch keinen doppelten Speicher - und bei meiner Variante ebenfalls nicht
    Deine Methode ist sicher am edelsten, aber zum Verstehen am schwersten.
    Ein Nachteil ist aber auch, dass sie nicht mit float, sondern nur mit int, int32_t und so was funktioniert, weil float keine Bitoperationen zulässt.
    Ich würde C_Classic diese Methode aber trotzdem empfehlen, solange er kein float hat.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2009
    Beiträge
    118
    Zitat Zitat von mare_crisium
    C_Classic,

    eine 32-Bit Zahl, die grösser als 16.777.215 ist, kann man nur invier 8-Bit Zahlen aufteilen - drei 8-Bit Zahlen reichen gerademal für 24 Bit .

    Die Umwandlung in einzelne 8-Bit Zahlen (also Bytes) geht so: Dividiere die Originalzahl durch 256. Der Divisionsrest ist die erste 8-Bit Zahl. Wenn das Ergebnis dieser Division grösser als Null ist, dann dividierst Du es wieder durch 256 und nimmst den Divisionsrest als zweite 8-Bit Zahl usw., bis das Divisionsergebnis gleich Null ist.

    Dieser Algorithmus gilt alle Zahlen, egal wieviel Bit sie haben .

    Ciao,

    mare_crisium
    Diese Version hört sich gut an, werds dann morgen mal probieren.


    eine 32-Bit Zahl, die grösser als 16.777.215 ist, kann man nur invier 8-Bit Zahlen aufteilen - drei 8-Bit Zahlen reichen gerademal für 24 Bit .
    Ist mir schon klar, aber mir reichen ja auch 24 bit. eigentlich brauch ich ja nur 18.

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @C_Classic:
    Könntest du mir bitte erklären, wie diese union denn aussehen muss... hab noch nie damit gearbeitet.
    Könnte so aussehen:
    Code:
    typedef union {
    	uint32_t bits;
    	struct {
    		uint8_t byte_1;
    		uint8_t byte_2;
    		uint8_t byte_3;
    		uint8_t byte_4;
    	};
    } fourbytes_t;
    Danach kann man eine Variable var32 so deklarieren:
    fourbytes_t var32;
    Auf die einzelnen Bytes kann man so zugreifen (uint8_t var8:
    Bytes auslesen: var8 = var32.byte_x;
    Bytes schreiben: var32.byte_x = var8;

    Gruß Dirk

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von _R2D2
    Naja auf jeden Fall funktioniert es.
    Weil GCC laut Dokumentation sich wie erwartet verhält. siehe Dokumentation

    Zitat Zitat von _R2D2
    Ein Nachteil ist aber auch, dass sie nicht mit float, sondern nur mit int, int32_t und so was funktioniert, weil float keine Bitoperationen zulässt.
    Ist ein Cast auf einen entsprechenden Integertypen so schlimm?

    mfG
    Markus

    EDIT: "GCC" aus dem Linktext entfernt, das Forum macht den Link sonst kaputt

  5. #15
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Ist ein Cast auf einen entsprechenden Integertypen so schlimm?
    Ich wusste nicht, dass das funktioniert, weil float das mit den Kommastellen und dem Bit für Vorzeichen (also negativ / positiv) ja etwas anders handhabt, wie ein int32_t (das ja gar keine Nachkommastellen haben kann), oder?
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Nach weiterer Recherche und einigen Experimenten mit GCC ziehe ich meine Aussage zum Cast zurück und behaupte das Gegenteil, natürlich kannst du float nicht auf Integer casten ohne dass dabei eine Typumwandlung oder abgrundtief verbotenes Type-Punning über Pointer stattfindet.

    Ich bin auf einen sehr guten Artikel zu dem Thema gestoßen, der die ganze Problematik sehr gründlich untersucht.
    Ebenso wie hier kommt man zu dem Ergebnis, dass Type-Punning über Unions nicht wirklich dem Standard entspricht, aber unter GCC das Mittel der Wahl ist, um Daten ohne Typumwandlung zu reinterpretieren.
    Unter letzerem Link ist übrigens auch ein Makro zu finden, dass das ganze vereinfachen soll, eine weitere Möglichkeit besteht darin, den Speicherbereich (via memcpy oder von Hand) zu kopieren, GCC sollte das gewünschte Vorhaben dann auch erkennen.

    Ich fasse die gefundenen Ergebnisse noch einmal kurz zusammen:
    Type-Punning über Unions ist im C-Standard undefiniert, über Pointertrickserei à la *(uint32_t *) &floatvariable sogar (strikt) verboten.
    GCC definiert, um solche Operationen zuzulassen, dass Unions (wie man es eigentlich erwarten würde) "a rein, b raus" ermöglichen.
    Aktiviert man den Compilerschalter "-fno-strict-aliasing" hat man den ganzen Stress auch nicht, dadurch werden aber einige Optimierungen unmöglich.

    mfG
    Markus

    PS: Die Ursache des ganzen liegt in der Spezifikation von C(99), die verbietet dass zwei Pointer unterschiedlichen Typs beim dereferenzieren auf das gleiche Objekt verweisen.

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen