C中数字的隐式类型是什么?例如,如果我在计算中有一个十进制数,小数总是被视为双精度?如果我有一个非十进制数字,它总是被视为一个int?如果我的非十进制数大于int值怎么办?
我很好奇,因为这会影响类型转换和促销。例如,如果我有以下计算:
float a = 1.0 / 25;
将1.0
视为双精度,将25
视为整数吗?然后将25
提升为double,以双精度执行计算,然后将结果转换为float吗?
怎么样:
double b = 1 + 2147483649; // note that the number is larger than an int value
答案 0 :(得分:3)
如果数字既没有小数点也没有指数,它是某种整数;默认情况下为int
。
如果数字有小数点或指数,则它是某种浮点数;默认情况下,为double
。
就是这样。您可以将后缀附加到数字(例如ULL
的{{1}})以更精确地指定类型。否则(简化一点),整数是保存值的最小unsigned long long
类型(类型int
或更长)。
在您的示例中,代码为:
int
float a = 1.0 / 25;
double b = 1 + 2147483649;
的值是通过注意a
是双精度而1.0
是整数来计算的。处理分部时,25
将转换为int
,执行计算(生成double
),然后将结果强制转换为double
以进行分配到float
。所有这些都可以由编译器完成,因此结果将被预先计算。
同样,在具有32位a
的系统上,值int
太大而不能成为214783649
,因此它将被视为大于{{的有符号类型1}}(int
或int
);添加long
(产生相同的类型),然后将该值转换为long long
。同样,这一切都是在编译时完成的。
这些计算受与C中其他计算相同的规则控制。
整数常量的类型规则详见§6.4.4.1ISO/ IEC 9899:1999的整数常量。有一个表根据后缀(如果有)和常量类型(十进制与八进制或十六进制)详细说明类型。对于十进制常量,该值始终是有符号整数;对于八进制或十六进制常量,类型可以根据需要进行签名或无符号,并且只要值适合。感谢Daniel Fischer指出我的错误。
答案 1 :(得分:0)
http://en.wikipedia.org/wiki/Type_conversion
该标准有一个可以预期的一般指导原则,但编制者有一套包含标准规则的规则以及优化规则。上面的链接讨论了一些你可以期待的一般性。如果您担心隐式强制,通常使用显式强制转换是一种好习惯。
请记住,不保证基元类型的大小。
1.0 / 25
评估为double,因为其中一个操作数是double。如果您将其更改为1/25
,则评估将作为两个整数执行,并评估为0
。
double b = 1 + 2147483649;
右侧被评估为整数,然后在分配期间被强制转换为双倍。
答案 2 :(得分:0)
实际。在您的示例中,您可能会收到编译器警告。你要么写1.0f使它成为一个浮动开始,要么在分配之前显式地转换你的结果。