我们为什么要输唱?

时间:2010-10-26 04:35:45

标签: c casting

如果我这样做:

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。 存储此临时值的位置是什么?为什么我们需要进行类型转换?

3 个答案:

答案 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.

相同