如果数字既没有小数点也没有指数,它是某种整数;默认情况下,一个int
.
如果数字有小数点或指数,它是某种浮点数;默认情况下,一个double
.
就是这样。您可以将后缀附加到数字(例如ULL
for unsigned long long
)以更精确地指定类型。否则(稍微简化一下),整数是保存该值的最小int
类型(类型int
或更长)。
在您的示例中,代码为:
float a = 1.0 / 25;
double b = 1 + 2147483649;
的值a
是通过注意它1.0
是一个双精度并且25
是一个整数来计算的。处理除法时,将int
转换为 a double
,执行计算(生成 a double
),然后将结果强制转换为 afloat
以分配给a
。所有这些都可以由编译器完成,因此结果将被预先计算。
类似地,在 32 位的系统上int
,值214783649
太大而不能成为int
,因此它将被视为大于int
(或long
或long long
)的有符号类型;添加了1
(产生相同的类型),然后将该值转换为 a double
。同样,这一切都是在编译时完成的。
这些计算受与 C 中其他计算相同的规则控制。
整数常量的类型规则在 ISO/IEC 9899:1999 的 §6.4.4.1 整数常量中有详细说明。有一个表格详细说明了取决于后缀(如果有)和常量类型(十进制与八进制或十六进制)的类型。对于十进制常量,值始终是有符号整数;对于八进制或十六进制常量,类型可以根据需要是有符号或无符号的,只要值合适。感谢Daniel Fischer指出我的错误。