类型转换整数为双精度,以获得来自类型整数的divison的双重结果

时间:2015-12-08 14:51:10

标签: c casting integer double

我不明白以下示例之间输出是双重的根本原因。就以下而言:

  • 为什么双重除以int会导致双倍?
  • 为什么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
    }
    

4 个答案:

答案 0 :(得分:4)

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

  

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

     

否则,如果任一操作数的相应实数类型是double,则另一个   操作数在不更改类型域的情况下转换为其类型的类型   相应的实际类型是双倍。

     

否则,如果任一操作数的相应实数类型为float,   另一个操作数在不更改类型域的情况下转换为a   相应的实数类型为float的类型。

     

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

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

答案 1 :(得分:1)

演员阵容优先于分区,doubleint之间的操作会产生double

答案 2 :(得分:1)

由于评估中的必要性,如果某个分区的操作数之一是双数据类型,则另一个操作数会自动提升为计算方法。在您的示例中,这是因为显式强制转换的运算符优先级高于divison。

如果您只想投射除法的结果,您可以这样做:

Shopware()->Events()->notify(
    'Shopware_Plugins_HttpCache_InvalidateCacheId',
    array(
        'cacheId' => 'a14',
    )
);

确保首先执行整数除法,然后执行显式转换为double。

答案 3 :(得分:1)

对于@dbush的优秀答案的附加上下文,重要的是要注意该标准指定对于包含不同类型的所有算术类型转换,该转换是从两种类型中较小的一种到最大的:

来自 C11的

汇总 - 6.3.1.8常规算术转换

  

1st:如果任一操作数的实数类型是long double,另一个是   转换为长双   第二:否则如果真实类型   操作数是double,另一个是double   第三:否则   如果任一操作数的实数类型为float,则另一个操作数转换为   浮

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