Почему целочисленные типы повышаются во время добавления в C?
Таким образом, у нас возникла проблема с полем, и после нескольких дней отладки мы сузили проблему до этого конкретного фрагмента кода, где обработка в цикле 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? Или это какая-то странность компилятора / аппаратного обеспечения?