Datum:
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!
Datum:
summe=((uint16_t)array[1]<<8)+array[2];
Datum:
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.
Datum:
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?
Datum:
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.
Datum:
Klasse, vielen Dank für die megaschnellen Antworten! Top-Forum!



