如果数字既没有小数点也没有指数,它是某种类型的整数;默认情况下为int
。
如果数字有小数点或指数,它是某种浮点数;默认情况下,一个double
。
就是这样。您可以将附加后缀添加到数字(例如的ULL
)以更精确地指定类型。否则(简化一点),整数是最小的int
类型(类型为int
或更长),将保存该值。
在你的实施例中,代码为:
float a = 1.0/25;
double b = 1 + 2147483649;
的a
值通过注意到1.0
是双和25
是一个整数计算。在处理分区时,将int
转换为double
,执行计算(生成double
),然后将结果强制转换为float
,分配给a
。所有这些都可以由编译器完成,所以结果将被预先计算。
类似地,具有32位int
的系统上,该值214783649
太大是一个int
,所以它会被视为有符号类型大于int
(无论long
或long long
);添加1
(产生相同类型),然后将该值转换为double
。再次,这一切都是在编译时完成的。
这些计算由相同的规则其他计算中C.
管辖为整数常量的类型规则在9899 ISO/IEC的§6.4.4.1整数常数详细:1999。有一个表根据后缀(如果有)和常量类型(十进制与八进制或十六进制)来详细说明类型。对于十进制常量,该值始终是有符号整数;对于八进制或十六进制常量,类型可以根据需要进行签名或未签名,并且只要该值适合。感谢Daniel Fischer指出我的错误。
我们可以告诉你,标准中尚未涵盖哪些内容? – 2012-04-17 20:33:55
我的解决方案总是'让编译器告诉你';) – 2012-04-17 20:34:26
1.0是一个浮点数,25是表达式中的整数。该部门被强制为一个浮点数,但如果你在1.0上删除了小数点,这是一个整数,除法是两个整数(0)请参阅下面的答案以获取更多信息。 – lukecampbell 2012-04-17 20:43:04