Wegen integer promotions in der C-Norm. Kurz: Jeder Typ "kleiner" als int
wird vor der Verwendung in int
konvertiert. Sie können dies im Allgemeinen nicht vermeiden.
So was geht weiter:i
wird zu int
befördert. Der Ausdruck wird als int
ausgewertet (die verwendeten Konstanten sind ebenfalls int
). Der Modul ist -1
. Dies wird dann durch die Zuweisung in uint8_t
: 255
umgewandelt.
Für printf
dann i
ist integer-gefördert int
(wieder): (int)255
. Dies schadet jedoch nicht.
Beachten Sie, dass in C89 für , a % b
nicht unbedingt negativ ist. Es wurde implementiert und könnte 15
sein. Da C99, -1 % 16
jedoch garantiert -1
ist, muss die Division den algebraischen Quotienten ergeben.
Wenn Sie das Modul ein positives Ergebnis überprüfen wollen, müssen Sie den gesamten Ausdruck auswerten unsigned
von i
Gießen:
i = ((unsigned)i - 1) % 16;
Empfehlung: Compiler-Warnungen aktivieren. Zumindest sollte die Konvertierung für die Zuweisung eine Abbruchwarnung geben.
uint - unsigned int, 0-1 wird zu MAX_INT –
@MarcB: '0 - 1' ist' -1'. 'MAX_INT' ist'> = 32767'. – Olaf
@olaf: Es ist ein unsigned int –