给定以下代码段:
#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?),我很感兴趣,因为我想更好地理解为什么以及何时必须手动转换(我在从不同架构移植程序时遇到问题)。