Andreas schrieb:
> fehlendeDatensaetze &= ~(1 << message_sequence_counter);
"1" als Konstante hat bei C immer den Typ "int", der bei dir offenbar 16
Bit hat, wovon eines das Sign-Bit ist. Die Berechnung der Bitmaske
erfolgt komplett mit dem Typ "int", deshalb kommt es ab 15 für
message_sequence_counter zu undefiniertem Verhalten.
Um den Compiler zu zwingen, einen anderen Datentyp zu verwenden, musst
du der Konstanten den entsprechenden Typ verpassen, entweder über Cast:
1 | fehlendeDatensaetze &= ~((uint32_t)1 << message_sequence_counter);
|
oder durch einen Suffix an der Konstanten:
1 | fehlendeDatensaetze &= ~(1UL << message_sequence_counter);
|
Welchen der Wege du wählst bleibt deinem Gusto überlassen.
Was du noch vielleicht noch wissen solltest: ein Shift um einen
variablen Wert kann z.B. bei AVR eine ziemlich teure Operation werden,
insbesondere mit 32Bit-Werten wie hier. Im Extremfall (bei
message_sequence_counter=31) braucht der Shift auf AVR mehr als 200
Takte! Wenn es also eng wird mit der Rechenleistung, dann kann sowas im
C-Code harmlos aussehendes durchaus zum Problem werden.
Andreas