学习是一种信仰。
分类: C/C++
2014-01-22 16:53:13
上机1_1:温度转换
int main()
{
int f;
float c;
scanf( "%d", &f );
//c = 5/9*(f-32);
c = 5.0/9*(f-32);
printf( "%.2f\n", c );
return 0;
}
现象: c = 5.0/9*(f-32)正确,输入93,输出33.98;
c = 5/9*(f-32)错误,输入93,输出0.00;
c语言的类型转换:
语句和表达式通常应该是只使用一种类型的变量和常量,但如果你使用了混合类型,C则会用一个规则集合来自动完成类型的转换。这可能很方便,但也可能很危险,尤其在你无意地混合使用了不同类型的情况下。
隐式类型转换规则:
C语言自动转换不同类型的行为称之为隐式类型转换 ,转换的基本原则是:低精度类型向高精度类型转换,具体是:
int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long -> float -> double -> long double
注意,上面的顺序并不一定适用于你的机器,比如当int和long具有相同字长时,unsigned int的精度就会比long的精度高(事实上大多数针对32机的编译器都是如此)。另外需要注意的一点是并没有将char和short型写入上式,原因是他们可以被提升到int也可能被提升到unsigned int。
提升数据的精度通常是一个平滑无损害的过程,但是降低数据的精度可能导致真正的问题。原因很简单:一个较低精度的类型可能不够大,不能存放一个具有更高精度的完整的数据。一个1字节的char变量可以存放整数101但不能存放整数12345。当把浮点类型数据转换为整数类型时,他们被趋零截尾或舍入。
强制类型转换:
通常我们应该避免自动类型转换,当我们需要手动指定一个准确的数据类型时,我们可以用强制类型转换机制来达到我们的目的,使用方法很简单,在需要强制转换类型的变量或常量前面加上(type),例如(double)i; 即把变量 i 强制转换成double型。
在c = 5/9*(f-32)中,右边是int,结果为0,左边是float,发生隐式类型转换,c为0.00;
在c = 5.0/9*(f-32)中,(f-32)的为int,结果为61,5.0/9发生隐式类型转换,转换为float,结果为9分之5,相乘为float,结果为33.98
因此,题中语句有两种写法:
c = 5.0/9*(f-32); --------------------发生隐式类型转换
c = (float)5/9*(f-32);--------------强制类型转换
int main()
{
int f;
int c1,c2;
float c;
scanf( "%d", &f );
//c = 5/9*(f-32);
c1 = 5/9*(f-32);
c2 = (float)5/9*(f-32);
c = 5.0/9*(f-32);
printf( "%d\n", c1 );-----------输出0
printf( "%d\n", c2 );-----------输出33
printf( "%.2f\n", c );----------输出33.98
return 0;
}