如果我这样做:
int i=3, j=10;
float f;
f=(i+j)/2;
so f won't get value 6.5 but 6.
但是,
f=(i+(float)j)/10;//edited
将是f=6.5
。
存储此临时值的位置是什么?为什么我们需要进行类型转换?
答案 0 :(得分:4)
f=(i+j(float))/10;
不正确;在其操作数之前,中的类型为:
f=(i+(float)j)/10;
反正。在计算算术运算符时,如果一个操作数是浮点类型而另一个操作数是整数类型,那么整数操作数将转换为浮点类型并执行浮点运算。
这是所谓的通常的算术转换的一部分(您可以通过搜索Google找到更多有关这些内容的文章,MSDN has a simple explanation of what they are)。
存储临时值的位置取决于编译器和计算机。它可能会存储在寄存器中,因为您将立即使用它,但它可以存储在堆栈或其他地方。
答案 1 :(得分:2)
C定义“整数提升”规则,用于确定将用于执行整数计算的类型。整数表达式将被提升为足够大的类型,以保存表达式中所有类型的值,如果可能,则为signed,否则为unsigned。通过将其中一个值转换为float,可以强制编译器执行浮点提升,从而将所有整数提升为合适的浮点类型。您也可以编写0.1 * (i+j)
,在这种情况下,i+j
将被计算为整数,然后被提升为浮点类型以乘以0.1。
答案 2 :(得分:0)
f =(i + j)/ 2将给出整数值,因为在RHS i,j,2中它们都是整数,因此结果将以整数的形式存储。 例如
int a;
float b;
b=a;
即使a的计算值为float,b也只存储a的整数值。这里的a可能与您的表达式(i+j)/2.