C中数字的隐含类型

时间:2012-04-17 20:31:09

标签: c types casting implicit-conversion coercion

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

3 个答案:

答案 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}}(intint);添加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使它成为一个浮动开始,要么在分配之前显式地转换你的结果。