我来自Ruby/PHP/Java背景,现在想学习C语言,发现在教程中几乎总是需要显式地进行类型转换。比如,我经常看到这样的代码:
double x, y;
x = 1.0;
/*...*/
y = x*5.0;
然而,在我的Mac版本的GCC上,自动转换似乎是有效的。
在事物上保留.0只是一种风格问题,还是有些C编译器不会自动转换?
常量的类型与它被赋值的类型相同:
int i = 1;
double x = 2; // 2.0
显式转换:
i = (int)x;
x = (double)i;
隐式转换:
i = x;
x = i;
类型提升:
x = i / 2.0; // i is promoted to double before being multiplied
x = (double)i / 2.0; // so evaluates as this
对比
x = i / 2; // i is not promoted because 2 is an int
x = (double)( i / 2 ); // so evaluates as this
当你增加精度(或至少不会失去任何精度)时,自动转换才起作用,例如int->float,int->char,char->int。
反过来需要进行强制类型转换,因为由程序员决定如何失去精度。通常情况下,这是通过向下取整来完成的,但特定应用可能需要随机向下取整和向上取整。
.0不仅仅是一种风格问题,它可能非常重要;尝试显示3/5和3.0/5.0。它们是非常不同的。
int
转换为 float
可能会丢失精度。但通常认为这是可以接受的。 - Roland IlligFLT_DIG >= 6
”,因此即使是7位整数,也可能太大而无法存储在float
中。 - Roland Illig