Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Zusammenführen und Umwandeln von Werten verschiedener Datentypen

Zusammenführen und Umwandeln von Werten verschiedener Datentypen

andreas_g
andreas_g05.03.1213:47
Hallo liebe MTN Community!

Ich sollte folgendes Problem lösen:
Ich habe 3 Werte vom Datentyp unsigned int, 32 bit breit.
Diese sollten nun zu einem einzigen Wert mit 80 bit Breite zusammengeführt werden (wobei der letzte Wert abgeschnitten wird) und anschließend als floating point weiter behandelt werden.

Beispiel:
Aus
Wert1: 0xF0F0F0F0
Wert2: 0x50505050
Wert3: 0x11111111

sollte werden:
0xF0F0F0F0505050501111

und dieser Wert als Fließkommazahl (long double?) behandelt werden.
Wie könnte dieses Probem in C gelöst werden?

Vielen Dank im Voraus für alle Tipps!

Andreas
0

Kommentare

andreas_g
andreas_g06.03.1207:39
Ich habe eine Lösung gefunden. Die Frage hat sich damit erledigt.
0
Urkman13.03.1219:02
Es ist immer sehr nett, wenn man dann auch die Lösung anderen mitteilt...
0
andreas_g
andreas_g14.03.1212:57
Urkman, du hast natürlich recht!
Die beispielhafte Fragestellung hat außerdem noch einen Fehler. Es sollte heißen:
Wert1: 0xF0F00000
Wert2: 0x50505050
Wert3: 0x11111111
gewünschtes Ergebnis: 0xF0F05050505011111111

Hier ein Ausschnitt aus dem Code (Uint32 ist ein integer Datentyp ohne Vorzeichen, 32 bit lang):

Uint32 value1 = 0xF0F00000;
Uint32 value2 = 0x50505050;
Uint32 value3 = 0x11111111;
Uint32 array[3];

if (big_endian) {
   array[0] = (value1&0xFFFF0000)|((value&0xFFFF0000)>>16); // big endian
   array[1] = ((value2&0xFFFF)<<16)|((value3&0xFFFF0000)>>16);
   array[2] = (value3&0xFFFF)<<16;
} else {
   array[0] = value3; // little endian
   array[1] = value2;
   array[2] = (value1>>16)&0xFFFF;
}
register long double *returnval = (long double *)array;
return(*returnval);

0
andreas_g
andreas_g14.03.1213:09
P.S.
Voraussetzung, dass dieser Code funktioniert ist:

sizeof(long double) >= 10; // byte
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.