可以将int值添加到浮点值吗?

时间:2017-07-29 12:35:40

标签: c

/**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

4 个答案:

答案 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)

是的,可以将一个整数值添加到浮点值。

基本数学运算(+-*/),当给定类型为floatint的操作数时,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)

值得一提的是:如果整数值可以添加到浮点值,症状会是什么?

  1. 编译器发出错误或警告消息。
  2. 有些东西被截断了;你没有得到你想要的结果。
  3. 未定义的行为:您可能会或可能不会得到您想要的结果,编译器可能会或可能不会警告您。
  4. 但实际上这些都不会发生。当您将一个整数添加到浮点值时,编译器会自动将整数转换为浮点值,以便它可以通过这种方式进行添加,这是完全明确定义的。例如,如果您有代码

    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转换为首先是长期的。