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

Ответы на вопрос(4)

Ваш ответ на вопрос