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?