给定以下代码片段:
#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?),因为我想更好地理解何时何地需要手动转换类型(我在从另一种架构移植程序时遇到了问题)。
int64 f = (int64)d * e;
。 - Paul Tomblin