0

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

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

float a = 1.0 / 25;

1.0视为双精度并被25视为整数?然后提升为25双精度,以双精度执行计算然后将结果转换为浮点数?

关于什么:

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

3 回答 3

4

如果数字既没有小数点也没有指数,它是某种整数;默认情况下,一个int.

如果数字有小数点或指数,它是某种浮点数;默认情况下,一个double.

就是这样。您可以将后缀附加到数字(例如ULLfor 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(或longlong long)的有符号类型;添加了1(产生相同的类型),然后将该值转换为 a double。同样,这一切都是在编译时完成的。

这些计算受与 C 中其他计算相同的规则控制。


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

于 2012-04-17T20:42:38.410 回答
0

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

该标准对您可以预期的内容有一个通用指南,但编译器有一个包含标准以及优化规则的规则超集。上面的链接讨论了您可以期待的一些一般性。如果您担心隐式强制转换,通常使用显式强制转换是一种很好的做法。

请记住,原始类型的大小无法保证。

1.0 / 25

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

double b = 1 + 2147483649;

右侧被评估为整数,然后在赋值期间强制为双精度。

于 2012-04-17T20:40:15.040 回答
0

实际上。在您的示例中,您可能会收到编译器警告。您可以编写 1.0f 以使其成为浮点数,或者在分配之前显式转换结果。

于 2012-04-17T22:40:52.237 回答