Warum werden Integer-Typen während der Addition in C gefördert?

So hatten wir ein Feldproblem und haben das Problem nach Tagen des Debuggens auf dieses bestimmte Stück Code eingegrenzt, bei dem die Verarbeitung in einer while-Schleife nicht stattgefunden hat:

// heavily redacted code
// numberA and numberB are both of uint16_t
// Important stuff happens in that while loop

while ( numberA + 1 == numberB )
{
    // some processing
}

Dies lief einwandfrei, bis wir die Grenze von 65535 für uint16 erreichten. Eine weitere Reihe von Druckanweisungen später stellten wir fest, dassnumberA + 1 hatte einen Wert von65536, währendnumberB zurück zu @ gewicke0. Die Prüfung ist fehlgeschlagen und es wurde keine Verarbeitung durchgeführt.

Das hat mich neugierig gemacht, also habe ich ein schnelles C-Programm (kompiliert mit GCC 4.9.2) zusammengestellt, um dies zu überprüfen:

#include <stdio.h>
#include <stdint.h>

int main()
{

    uint16_t numberA, numberB;
    numberA = 65535;
    numberB = numberA + 1;

    uint32_t numberC, numberD;
    numberC = 4294967295;
    numberD = numberC + 1;

    printf("numberA = %d\n", numberA + 1);
    printf("numberB = %d\n", numberB);

    printf("numberC = %d\n", numberC + 1);
    printf("numberD = %d\n", numberD);

    return 0;
}

Und das Ergebnis war:

numberA = 65536
numberB = 0
numberC = 0
numberD = 0

So scheint es, dass das Ergebnis vonnumberA + 1 wurde zu uint32_t befördert. Ist das mit der C-Sprache gemeint? Oder ist das eine Seltsamkeit des Compilers / der Hardware?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage