www.mikrocontroller.net

Forum: GCC Typecast und Overflow beim Schieben


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Florian G. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

ich habe eine Frage zu C bzw. WINAVR:

Ich habe folgenden Code:
uint8_t  array[5];
uint16_t summe;

summe=(array[1]<<8)+array[2]; 

Mit diesem Code will ich aus den beiden Bytes im array einen 16-bit-Wert 
machen. Das scheint auch zu funktionieren. Nun habe ich aber bemerkt, 
dass es ja eigentlich einen Overflow geben müsste, wenn ich den 
8-bit-Wert schiebe. Oder passiert das nicht weil der Compiler erkennt 
dass die Variable summe ein 16-bit-Wert ist?

Gibt es da eine elegante Möglichkeit die obige Codezeile "abzusichern", 
so dass in jedem C-Compiler dann auch das Gleiche passiert?

Vielen Dank für Antworten!

Autor: cast (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
summe=((uint16_t)array[1]<<8)+array[2];

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Florian G. schrieb:

> Nun habe ich aber bemerkt,
> dass es ja eigentlich einen Overflow geben müsste, wenn ich den
> 8-bit-Wert schiebe.

Nein. Arithmetik wird mindestens in Grösse "int" ausgeführt, auch wenn 
die Operanden kleiner sind. Zumindest muss das Ergebnis dem entsprechen.

Die Zeile
  summe=(array[1]<<8)+array[2];
entspricht also effektiv:
  summe = ((int)array[1] << 8) + (int)array[2];

NB: Leerzeichen kosten nichts.

> Oder passiert das nicht weil der Compiler erkennt
> dass die Variable summe ein 16-bit-Wert ist?

Nein.

Autor: Florian G. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Danke für die schnelle Antwort!

Daraus ergibt sich für mich noch eine Frage aus Interesse:

Legt der Compiler dann eine zusätzliche (temporäre) 16-bit Variable an 
um darin schieben zu können? Oder wird das dann gleich in der Variable 
"summe" erledigt die ja ohnehin vorhanden ist und 16-bit breit ist?

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Florian G. schrieb:

> Legt der Compiler dann eine zusätzliche (temporäre) 16-bit Variable an
> um darin schieben zu können? Oder wird das dann gleich in der Variable
> "summe" erledigt die ja ohnehin vorhanden ist und 16-bit breit ist?

Das kann der Compiler halten wie er will. Und sollte nicht dein Problem 
sein.

Autor: Florian G. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Klasse, vielen Dank für die megaschnellen Antworten! Top-Forum!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
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.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net