... z.B. mit einer union, in der mittels struct die 3 Bytes definiert werden....32 bit) in 3 kleine 8-Bit-Zahlen aufteilen. Wie kann man so etwas machen?
Gruß Dirk
Hey,
ich schreibe gerade eine Funktion, um ein EEPROM anzusteuern. Dieses hat 18 Adressleitungen. Nun möchte ich meiner Funktion einfach eine Zahl übergeben, die dann auf die 3 Ports aufgeteilt wird.
Dazu muss ich die große Zahl (momentan 32 bit) in 3 kleine 8-Bit-Zahlen aufteilen. Wie kann man so etwas machen?
MfG C_Classic
... z.B. mit einer union, in der mittels struct die 3 Bytes definiert werden....32 bit) in 3 kleine 8-Bit-Zahlen aufteilen. Wie kann man so etwas machen?
Gruß Dirk
Könntest du mir bitte erklären, wie diese union denn aussehen muss... hab noch nie damit gearbeitet.
3*8 gibt aber nicht 32. Deswegen brauchst du doch 4 Teile und nicht 3?!
Du kannst das z.B. so machen (ich hab es nicht probiert aber theoretisch müsse es doch so funktionieren?):
Code:struct SFloat { char parts[4]; }; SFloat zahl2; float zahl1; zahl2 = (SFloat)(zahl1);
Ja, aber ich hab 18 Adressleitungen und 32Bit ist die nächst-größte Bit-Zahl, die der GCC unterstützt. Deshalb reichen mir 3 Teile.3*8 gibt aber nicht 32.
Wie kann ich jetzt bei deiner Variante auf die einzelnen Teile zugreifen?
Nimm lieber sowas:
input: 32-Bit EingabewertCode:output = (input >> (byte * 8)) & 0xFF;
output: 8-Bit Ausgabewert
byte: Index des Bytes (0 .. 3)
Am besten Funktioniert das ganze wenn "byte" eine Konstante ist, dann pickt sich der GCC einfach das passende Byte aus dem (u)int32_t raus.
mfG
Markus
PS: Type-Punning mit Unions sollte man vermeiden
Falls meine Variante funktioniert, dann so:Wie kann ich jetzt bei deiner Variante auf die einzelnen Teile zugreifen?
zahl2.parts[x]
x muss dabei zwischen 0 und 3 liegen.
C_Classic,
eine 32-Bit Zahl, die grösser als 16.777.215 ist, kann man nur in vier 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
Warum solte man das vermeiden? Das ist 1. praktisch und 2. braucht man nicht doppelt so viel Speicher.Type-Punning mit Unions sollte man vermeiden
Weil Unions nicht dafür gemacht sind, "a" reinzustecken und "b" rauszuholen.
Das kann funktionieren, muss es aber nicht, das Verhalten ist für diesen Fall unspezifiziert!
http://en.wikipedia.org/wiki/Type_punning#cite_note-0
mfG
Markus
PS: Wenn du castest brauchst du auch keinen doppelten Speicher - und bei meiner Variante ebenfalls nicht
Lesezeichen