【问题标题】:Typecasting integers as doubles to get a double result from divison of the typecasted integers将整数类型转换为双精度数以从类型转换整数的除法中获得双精度结果
【发布时间】:2016-03-13 13:13:18
【问题描述】:

我不明白以下示例之间的输出是双倍的根本原因。方面:

  • 为什么双精度除以整数会得到双精度?
  • 为什么一个 int 除以一个 double 会得到一个 double?

    #include <stdio.h>
    
    int main(int agrc, char **argv)
    {
    
    double d;
    int a=5,b=2;
    
    d = (double)a/b;   
    printf("d= %G\n",d); // outputs 2.5
    
    d = a/(double)b; 
    printf("d= %G\n",d); // outputs 2.5
    }
    

【问题讨论】:

  • 强制转换任一操作数会强制进行double 计算。而如果你使用d = (double)(a/b);,那么int除法会在考虑演员表之前执行。

标签: c casting integer double


【解决方案1】:

强制转换优先于除法,doubleint 之间的运算将产生 double

【讨论】:

    【解决方案2】:

    来自C standard, section 6.3.1.8: Usual arithmetic conversions:

    首先,如果任一操作数对应的实数类型是long double, 另一个操作数在不改变类型域的情况下转换为 对应的实数类型为 long double 的类型。

    否则,如果任一操作数对应的实数类型为双精度,则另一 操作数在不改变类型域的情况下被转换为一个类型 对应的实数类型是double。

    否则,如果任一操作数对应的实数类型是浮点数, 另一个操作数在不改变类型域的情况下转换为 对应实类型为 float 的类型。

    否则,对两个操作数都执行整数提升。

    因此,如果算术运算符的一个操作数是int,另一个是double,则标准规定结果表达式的类型为double

    【讨论】:

    • open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 第 44 页,底部,“常用算术转换”
    • @ryyker 那个是 C++ 的,不是 C 的。
    • 注意:C (C11 §5.2.4.2.2 9) 还允许double 数学以高于所需的精度发生,例如long double。如果int 的范围超过了double 的精度并且a.b 的值很大,这可能会在这种情况下产生影响。
    【解决方案3】:

    由于求值的需要,如果一个除法的操作数之一是双精度数据类型,另一个自动提升为计算手段。在您的示例中,发生这种情况是因为显式转换的运算符优先级高于除法。

    如果你只想转换除法的结果,你可以这样做:

    d = (double)(a/b);
    

    为了确保首先执行整数除法,然后执行显式转换为双精度。

    【讨论】:

      【解决方案4】:

      对于@dbush 出色答案的其他上下文,重要的是要注意标准规定对于包含不同类型的所有算术类型转换,转换是从两种类型中的较小者到最大的:

      总结来自C11 - 6.3.1.8 通常的算术转换

      第一个:如果任一操作数的实际类型为 long double,则另一个为 转换为长双精度
      2nd:否则,如果任何一个的真实类型 操作数为双精度,另一个转换为双精度
      第三:否则 如果任一操作数的实际类型为浮点数,则将另一个转换为 浮动

      然后它继续指定如何以类似的方式进行整数促销......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2014-11-10
        • 2014-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-13
        相关资源
        最近更新 更多