Итак, у нас была проблема с полем, и после нескольких дней отладки сузилась проблема до этого конкретного кода, где обработка в цикле while не происходила:
// heavily redacted code
// numberA and numberB are both of uint16_t
// Important stuff happens in that while loop
while ( numberA + 1 == numberB )
{
// some processing
}
Это было нормально, пока мы не достигли предела uint16, равного 65535. Еще одна группа заявлений о печати позже, мы обнаружили, что numberA + 1
имеет значение 65536
, а numberB
- к 0
. Это не удалось проверить, и обработка не была выполнена.
Мне было любопытно, поэтому я собрал быструю программу C (скомпилированную с GCC 4.9.2), чтобы проверить это:
#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;
}
И результат:
numberA = 65536
numberB = 0
numberC = 0
numberD = 0
Итак, кажется, что результат numberA + 1
был повышен до uint32_t. Является ли это языком C? Или это какая-то странность компилятора/аппаратного обеспечения?