/**Program for internal typecasting of the compiler**/
#include<stdio.h>
int main(void)
{
float b = 0;
// The Second operand is a integer value which gets added to first operand
// which is of float type. Will the second operand be typecasted to float?
b = (float)15/2 + 15/2;
printf("b is %f\n",b);
return 0;
}
输出:b是14.500000
答案 0 :(得分:1)
b = (float)15/2 + 15/2;
第一个((float)15/2)
可以正常工作。第二个也可以工作,但会先转换为整数,这样你就会失去精度。像:
b = (float)15/2 + 15/2;
b = 7.500000f + 7
b = 14.500000
答案 1 :(得分:1)
经验法则:在两种不同的内置类型之间进行算术运算时,&#34;较小的&#34;类型将被转换为&#34;更大的&#34;类型。
double
&gt; float
&gt; long long
(C99)&gt; long
&gt; short
&gt; char
。
b = (float)15/2 + 15/2;
此处第一部分(float)15/2
相当于15.0f / 2
。因为涉及&#34;较大&#34;类型和&#34;较小的&#34; type会产生&#34;更大的&#34;类型(float)15/2
为7.500000,或7.5f
。
当涉及15/2
时,因为两个操作数都是整数,所以操作仅在整数级别上完成。因此,小数点被剥离(从int),结果只给出7。
所以表达式计算成
b = 7.5f + 7;
毫无疑问,您将14.500000
作为最终结果,因为它完全是14.5f
。
答案 2 :(得分:0)
是的,可以将一个整数值添加到浮点值。
基本数学运算(+
,-
,*
,/
),当给定类型为float
和int
的操作数时,int
首先转换为float
。
因此15.0f + 2
会将2
转换为float
(即2.0f
),结果为17.0f
。
在您的表达式(float)15/2 + 15/2
中,由于/
的优先级高于+
,因此效果与计算((float)15/2) + (15/2)
相同。
(float)15/2
明确将15
转换为float
,因此会隐式将2
转换为浮点数,从而产生除法的最终结果为7.5f
。
但是,15/2
执行整数除法,因此生成结果7
(此处没有隐式转换为float
。
由于(float)15/2
已计算为浮点数,因此在添加之前,值7
将转换为float
。因此结果为14.5f
。
注意:浮点类型的特征还在于影响操作的有限精度和舍入误差。我在上面忽略了这一点(并且不管怎么说,它都不可能对特定的例子产生显着的影响。)
注2:旧版本的C(在C89 / 90标准之前)实际上将float
个操作数转换为表达式中的double
(因此必须转换类型的值)将结果存储在double
类型的变量中时,float
返回float
。值得庆幸的是,C89 / 90标准确定了这一点。
答案 3 :(得分:0)
值得一提的是:如果整数值不可以添加到浮点值,症状会是什么?
但实际上这些都不会发生。当您将一个整数添加到浮点值时,编译器会自动将整数转换为浮点值,以便它可以通过这种方式进行添加,这是完全明确定义的。例如,如果您有代码
double d = 7.5;
int i = 7;
double result = d + i;
编译器将此解释为就像您已编写
一样double result = d + (double)i;
它几乎适用于所有操作:当你减去,乘以或除以浮点值和整数时,应用相同的逻辑。
它适用于几乎所有类型。如果添加long int和int,则plain int会自动转换为long。
作为一般规则(我真的想不到太多的例外),编译器总是想对两个相同类型的值进行算术运算。因此,只要您有两个不同类型的值,编译器就会总是为您转换其中一个。关于它如何做到这一点的完整规则是相当精细的,但它们都应该是有意义的,并做你想要的。完整的规则集称为通常的算术转换,如果您对该短语进行Google搜索,您会找到许多解释。
当不 特别是,如果两个变量都是整数,并且您正在进行的操作是除法,则编译器不必转换任何内容:它将整数除以整数,丢弃任何余数,并给你一个整数结果。所以,如果你有
int i = 1;
int j = 2;
int k = i / j;
然后k
最终包含0.如果你有
double d = i / j;
然后d
最终也包含0,因为编译器在执行除法时遵循完全相同的规则;它不会“偷看”,看到它需要一个浮点结果。
P.S。我说,“作为一般规则,编译器总是想对两个相同类型的值进行算术运算”,我说我想不出太多例外。但是如果你很好奇,那么<<
和>>
运算符就有两个例外。如果你有x << y
,其中x
是一个long int而y
是一个普通的int,编译器不必须将y
转换为首先是长期的。