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
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.
Dachte, Messwerte werden generell linksbündig verwaltet, um unproblematisch die Genauigkeit erhöhen/verringern zu können.
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]
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.