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).