次のスニペットがあるとします。
#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 にキャストされます。2 番目の乗算はキャストされません。プログラムが IA32 で実行されていたために結果が異なるのか、それとも C 標準のどこかで定義されているために結果が異なるのかはわかりません。それにもかかわらず、この正確な動作がどこか (ISO/IEC 9899?) で定義されているかどうかに興味があります。手動でキャストする必要がある理由とタイミングをよりよく理解したいからです (別のアーキテクチャからプログラムを移植する際に問題があります)。