long long против int умножения

Учитывая следующий фрагмент:

#include <stdio.h>

typedef signed long long int64;
typedef signed int int32;
typedef signed char int8;

int main()
{
    printf("%i\n", sizeof(int8));
    printf("%i\n", sizeof(int32));
    printf("%i\n", sizeof(int64));

    int8 a = 100;
    int8 b = 100;
    int32 c = a * b;
    printf("%i\n", c);

    int32 d = 1000000000;
    int32 e = 1000000000;
    int64 f = d * e;
    printf("%I64d\n", f);
}

Выход с MinGW GCC 3.4.5 составляет (-O0):

1
4
8
10000
-1486618624

Первое умножение приводится к int32 внутри (согласно выводу ассемблера). Второе умножение не приведено. Я не уверен, отличаются ли результаты, потому что программа работала на IA32, или потому что она определена где-то в стандарте C. Тем не менее меня интересует, определено ли это точное поведение где-либо (ISO / IEC 9899?), Потому что мне нравится лучше понимать, почему и когда мне приходится выполнять приведение вручную (у меня проблемы с переносом программы из другой архитектуры).

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

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