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?), Потому что мне нравится лучше понимать, почему и когда мне приходится выполнять приведение вручную (у меня проблемы с переносом программы из другой архитектуры).