以下表达式会发生什么转换?

时间:2015-07-10 08:07:14

标签: c type-conversion

在下面的表达式中,会发生什么转换?

long long a;
long long b;
double c;
b=a*c;

假设long long类型为8字节。

如果ab都是int,那么在b = a * c表达式中,a将转换为double并进行乘法运算使用c,结果将转换为int并分配给b

我的假设是否正确?

3 个答案:

答案 0 :(得分:2)

b=a*c;

相当于:

b=(long long) ( (double)a * c );

所以涉及两次转化,首先是从long longdouble,第二次是从double结果到long long

有关详细信息,请查看this page from Joachim Pileborg's评论

答案 1 :(得分:1)

根据C11标准,章节§6.3.1.8,常用算术转换

  

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

所以,你的陈述基本上是

b= (long long)( (double)a * c );

也就是说,对于*操作数,cdouble,因此a的值转换为double值,执行乘法,结果类型为double,最后,根据long long本身的类型,该值在分配给b时转换为b

答案 2 :(得分:0)

根据C标准(6.3.1.8常规算术转换)

  

1许多期望算术类操作数的运算符会导致   以类似的方式转换和生成结果类型。目的是为了   确定操作数和结果的通用实数类型....这   模式称为通常的算术转换:

     

...

     

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

和(6.5.16分配操作员)

  
      
  1. 赋值表达式的类型是左操作数的类型   将在左值转换后进行。
  2.   

和(6.5.16.1简单分配)

  

2 Insimple assignment(=),转换右操作数的值   到赋值表达式的类型并替换存储的值   在左操作数指定的对象中。

因此在本声明中

b = a * c;
第一个对象a

转换为类型double,评估的右操作数的类型为double。之后,右操作数的值将转换为赋值表达式的类型,该表达式具有左a * c转换为long long int的结果的左操作数的类型。

考虑到即使c等于1表达式a * c由于转化而不一定等于a * 1

考虑以下计划

#include <stdio.h>
#include <limits.h>

int main( void )
{
    long long a = LLONG_MAX;
    long long b;
    double c = 1;

    printf( "a = %lld\n", a );
    printf( "c = %lf\n", c );

    b = a * c;

    printf( "b = %lld\n", b );
}    

程序输出可能看起来像

a = 9223372036854775807
c = 1.000000
b = -9223372036854775808