Marc schrieb:
> if((SLAVE_ADDRESS + command + value) == checksum)
dir ist hoffentlich klar, dass der linke Teil (die Berechnung) als int
Berechnung gemacht wird, laut C-Spezifikation
Damit wird auch der rechte Teil auf int hochgehoben und der Vergleich
auch als int Vergleich gemacht.
> Und es liegt am Carry
Es liegt eben nicht am Carry. In C gibt es gar keinen Carry.
Es liegt daran, dass du fälschlicherweise annimmst, dass 2 unsigned char
zusammenaddiert wieder einen unsigned char ergeben. Dem ist aber nicht
so!
Berechnungen werden in C niemals in einem kleineren Datentyp als dem
Datentyp int gemacht (*). In diesem Sinne sind
1 | if((SLAVE_ADDRESS + command + value) == checksum)
|
und
1 | uint8_t summ = SLAVE_ADDRESS + command + value;
|
2 | if(summ == checksum)
|
3 | ...
|
2 völlig verschiedene Paar Schuhe!
(*) Es sei denn, der Optimizer kann beweisen, dass sich das Ergebnis
nicht verändert, wenn er (bei einem 16 Bit int) das High-Byte ignoriert
und nicht berechnet. Bei dir unterscheiden sich aber die Ergebnisse,
daher muss die Berechnung als int-Berechnung gemacht werden.