在下面的表达式中,会发生什么转换?
long long a;
long long b;
double c;
b=a*c;
假设long long
类型为8字节。
如果a
和b
都是int
,那么在b = a * c
表达式中,a
将转换为double
并进行乘法运算使用c
,结果将转换为int
并分配给b
。
我的假设是否正确?
答案 0 :(得分:2)
b=a*c;
相当于:
b=(long long) ( (double)a * c );
所以涉及两次转化,首先是从long long
到double
,第二次是从double
结果到long long
有关详细信息,请查看this page from Joachim Pileborg's评论
答案 1 :(得分:1)
根据C11
标准,章节§6.3.1.8,常用算术转换
....否则,如果任一操作数的相应实数类型是double,则另一个 操作数在不更改类型域的情况下转换为其类型的类型 相应的实际类型为
double
。
所以,你的陈述基本上是
b= (long long)( (double)a * c );
也就是说,对于*
操作数,c
为double
,因此a
的值转换为double
值,执行乘法,结果类型为double
,最后,根据long long
本身的类型,该值在分配给b
时转换为b
。
答案 2 :(得分:0)
根据C标准(6.3.1.8常规算术转换)
1许多期望算术类操作数的运算符会导致 以类似的方式转换和生成结果类型。目的是为了 确定操作数和结果的通用实数类型....这 模式称为通常的算术转换:
...
否则,如果任一操作数的相应实数类型为double, 另一个操作数在不更改类型域的情况下转换为a 其对应的实数类型为double的类型
和(6.5.16分配操作员)
- 赋值表达式的类型是左操作数的类型 将在左值转换后进行。
醇>
和(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