long long vs int multiplicação

Dado o seguinte snippet:

#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);
}

A saída com MinGW GCC 3.4.5 é (-O0):

1
4
8
10000
-1486618624

A primeira multiplicação é convertida para um int32 internamente (de acordo com a saída do assembler). A segunda multiplicação não é lançada. Não tenho certeza se os resultados diferem porque o programa estava sendo executado em um IA32 ou porque está definido em algum lugar no padrão C. No entanto, estou interessado em saber se esse comportamento exato é definido em algum lugar (ISO / IEC 9899?), Porque eu gosto de entender melhor por que e quando devo converter manualmente (tenho problemas para portar um programa de uma arquitetura diferente).

questionAnswers(4)

yourAnswerToTheQuestion