продвижение типов в C

Я совсем запутался в следующем коде:

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

int main(int argc, char ** argv)
{
    uint16_t a = 413;
    uint16_t b = 64948;

    fprintf(stdout, "%u\n", (a - b));
    fprintf(stdout, "%u\n", ((uint16_t) (a - b)));

    return 0;
}

Который возвращает:

$ gcc -Wall test.c -o test
$ ./test
4294902761
1001
$ 

Кажется, что выражение (a - b) имеет тип uint32_t. Я не понимаю почему, поскольку оба оператора имеют тип uint16_t.

Может ли кто-нибудь объяснить мне это?

6
задан unwind 31 October 2011 в 14:03
поделиться