signed typecast 32-bit in 16-bit

Gast #3495788
Lesenswert?
• ▲
▼
Hallo,

ich habe einen Fehler mit dem cast gemacht. Würde aber gerne etwas 
erfahren, was ich da genau gemacht habe.

Ich habe eine Variable signed 16-bit:
int16_t s16fooword

In einer Rechnung habe ich aber folgendes gemacht:
s16fooword = (int32_t) (F_CPU/60)*u16rpm*s16multiplier;

wobei rmp ein uint16_t ist und s16multiplier int16_t (und daher auch 
negativ)

Der Wert der gecasteten Zahl hat gestimmt, nur war das Vorzeichen weg 
bzw. die Zahl war positiv, obwohl s16multiplier negativ ist.

Was genau ist da passiert?
Richtig wollte ich eigentlich so casten:

s16fooword = (int16_t) ((F_CPU/60)*u16rpm*s16multiplier;

Danke.
#3495837
Lesenswert?
• ▲
▼
Aus
   (int32_t) (F_CPU/60)*u16rpm*s16multiplier
also
   ((int32_t)(F_CPU/60) * u16rpm) * s16multiplier
wird vom Typ her
   (int32_t * uint16_t) * int16_t
und danach
   int32_t * int16_t
und folglich sollte das Vorzeichen erhalten bleiben.

Hingegen wird aus
   (int16_t) ((F_CPU/60)*u16rpm*s16multiplier)
vom Typ her
   (int16_t) ((? * uint16_t) * int16_t)
und da hängt es von ? ab, ob das Vorzeichen bleibt oder nicht.
#3495882
Lesenswert?
• ▲
▼
Peter Dannegger schrieb:
> Unsigned * signed wird also in unsigned ausgeführt.

Unsigned hat nur dann Vorrang gegenüber signed, wenn es mindestens 
gleich gross ist, und nicht kleiner als int.

Also gilt:
  unsigned int * signed int => unsigned int
Es gilt nicht, wenn die signed Seite grösser als die unsigned Seite ist:
  uint16_t * int32_t => int32_t
Auch nicht, wenn beide Seiten kleiner sind als int:
  uint8_t * int8_t => int
Gast #3496073
Lesenswert?
• ▲
▼
Ich habe den Code leider im Moment nicht hier auf der Arbeit und habe 
das nur aus dem Kopf zusammengeschrieben.
F_CPU ist per Makro als 8000000UL definiert.

Aber die Ausführungen haben mir geholfen zu verstehen, wie das mit dem 
Verwerten der Datentypen und Casten läuft

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.