2012-04-17 39 views
0

C中数字的隐式类型是什么?例如,如果我在计算中有一个小数,那么小数总是被视为双精度?如果我有一个非十进制数,它是否总是被视为一个int?如果我的非十进制数大于一个int值,该怎么办?C中数字的隐式类型

我很好奇,因为这会影响类型转换和升级。举例来说,如果我有以下的计算:

float a = 1.0/25; 

1.0当作一张双人床和25视为一个int? 25然后升级为双精度,计算以双精度执行,然后结果转换为浮点数?

什么:

double b = 1 + 2147483649; // note that the number is larger than an int value 
+2

我们可以告诉你,标准中尚未涵盖哪些内容? – 2012-04-17 20:33:55

+1

我的解决方案总是'让编译器告诉你';) – 2012-04-17 20:34:26

+0

1.0是一个浮点数,25是表达式中的整数。该部门被强制为一个浮点数,但如果你在1.0上删除了小数点,这是一个整数,除法是两个整数(0)请参阅下面的答案以获取更多信息。 – lukecampbell 2012-04-17 20:43:04

回答

3

如果数字既没有小数点也没有指数,它是某种类型的整数;默认情况下为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(无论longlong long);添加1(产生相同类型),然后将该值转换为double。再次,这一切都是在编译时完成的。

这些计算由相同的规则其他计算中C.


管辖为整数常量的类型规则在9899 ISO/IEC的§6.4.4.1整数常数详细:1999。有一个表根据后缀(如果有)和常量类型(十进制与八进制或十六进制)来详细说明类型。对于十进制常量,该值始终是有符号整数;对于八进制或十六进制常量,类型可以根据需要进行签名或未签名,并且只要该值适合。感谢Daniel Fischer指出我的错误。

+1

2147483649是一个无后缀的十进制常量,由6.4.4.1它将是第一种类型的'int','long int','long long int',可以保存值,而不是'unsigned int'。不过,很好的答案,+1。 – 2012-04-17 20:52:49

+0

谢谢@Daniel;固定。 – 2012-04-17 21:36:20

0

http://en.wikipedia.org/wiki/Type_conversion

标准有,你可以期待什么,但是编译器有那包括用于优化的标准和规则,规则的一个超集的一般准则。以上链接讨论了您可以预期的一些概况。如果您担心隐式强制,那么使用显式强制转换通常是很好的做法。

请记住,原始类型的大小不能保证。

1.0/25 

因为其中一个操作数是双精度值,所以计算结果为double。如果将其更改为1/25,则评估将以两个整数执行并评估为0

double b = 1 + 2147483649; 

在赋值过程中,右侧评估为整数,然后强制为双精度值。

+0

是的,我也看到了。它只解释类型转换是什么。 [本文的这一部分](http://en.wikipedia.org/wiki/Type_conversion#Implicit_type_conversion)更好,但最有可能不全面。 – 2012-04-17 20:42:30

0

其实。在你的例子中你可能会得到一个编译器警告。你可以写1.0f来使它成为一个浮动开始,或者在分配它之前明确地转换你的结果。