Forum: PC-Programmierung Mit 24 Bit Daten rechnen?


von Peterle (Gast)


Lesenswert?

Hallo,

ich bekomme von einem Sensor vorzeichenbehaftet 24 Bit Messdaten zurück:

0x800000 = -8388608
0x800001 = -8388607
0xFFFFFC = -4
0xFFFFFF = -1

usw.

Wie kann ich nun in C damit unter Verwendung eines int32_t rechnen, 
insbesondere dividieren?

Für den Kompiler ist ja 0xFFFFFC nicht -4 sondern 16777212, somit ist 
auch das Ergenbis nicht -2, wenn man z.B. durch 2 dividiert. Wie 
funktioniert das?

Peterle

von Sebastian Hepp (Gast)


Lesenswert?

Du musst um das Vorzeichen auf 32 Bit erweitern.

von Peterle (Gast)


Lesenswert?

Das heißt 8 bit nach links schieben?

von Udo S. (urschmitt)


Lesenswert?

Siehe K2 Komplement.
Wenn das MSB Bit eine 1 ist, dann ist es eine negative Zahl. In dem Fall 
musst du links mit FF erweitern, sonst mit 00.

von Steffen R. (steffen_rose)


Lesenswert?

Dachte, Messwerte werden generell linksbündig verwaltet, um 
unproblematisch die Genauigkeit erhöhen/verringern zu können.

von Detlef K. (adenin)


Lesenswert?

Peterle schrieb:
> Das heißt 8 bit nach links schieben?

Ja das geht. Das ist der einfachste Fall.
Das entspricht einer Multiplikation mit 256.

Ansonsten geht dies.
[c]
int32_t tmp;

 tmp = messwert << 8;  //tmp ist messwert *256

//oder

 tmp = int32_t((uint32_t)messwert << 8) >> 8;  //tmp = messwert

//oder
 tmp = messwert > 0x007FFFFF ? messwert | 0xFF000000 : messwert;

//oder
 tmp = messwert & 0x00800000 ? messwert | 0xFF000000 : messwert;
//oder ...

[c]

von B. S. (bestucki)


Lesenswert?

Detlef Kunz schrieb:
> tmp = int32_t((uint32_t)messwert << 8) >> 8;  //tmp = messwert

Das Resultat einer Schiebeoperation ist implementation defined, wenn der 
zu schiebende Wert negativ ist. Mit GCC funktioniert die Sache, andere 
Compiler sehen das evt. anders.
http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html#Integers-implementation

von Tom (Gast)


Lesenswert?

Steffen Rose schrieb:
> Dachte, Messwerte werden generell linksbündig verwaltet, um
> unproblematisch

Nein, Hersteller von Sensoren denken sich scheinbar das 
kompliziertmöglichste Format aus und schreiben die 2 Zeilen C, die aus 
dem 17-relevante-Bits-irgendwie-auf-4-Byte-verteilt-Wert (mit Vorzeichen 
irgendwo in der Mitte) eine Zahl machen, generell nie ins Datenblatt, um 
die Anwender mental fit zu halten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.