2010-10-26 71 views
1

如果我做的:为什么我们要打字?

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

+1

恕我直言,'(i + j)/ 10'等于'1.3'。 – Benoit 2010-10-26 04:43:06

回答

4
f=(i+j(float))/10; 

不正确;在铸造类型来之前其操作数:

f=(i+(float)j)/10; 

反正。评估算术运算符时,如果一个操作数是浮点类型,另一个是整数类型,则整型操作数转换为浮点类型并执行浮点算术。

这是所谓的通常的算术转换的一部分(您可以通过搜索谷歌,但MSDN has a simple explanation of what they are找到更多关于这些)。

临时值的存储位置取决于编译器和计算机。它很可能会被存储在一个寄存器中,因为你会立即使用它,但它可以存储在堆栈或其他地方。

2

C定义了“整体提升”规则,该规则确定将使用什么类型来执行整数计算。整数表达式将被提升为一个足够大的类型来保存表达式中所有类型的值,如果可能,则为signed,否则为unsigned。通过将其中一个值强制浮动,您可以强制编译器执行浮点升级,将所有整数提升为合适的浮点类型。您也可以编写0.1 * (i+j),在这种情况下,i+j将计算为整数,,然后升级为浮点类型以与0.1相乘。

+1

或者只是'.../2.0'使它更接近问题:p – 2010-10-26 04:52:50

+2

乘以0.1和除以10是不相同的。 – 2010-10-26 05:09:40

0

f =(i + j)/ 2将给出整数值,因为在RHS i,j,2中它们都是整数,因此结果将以整数形式存储。 例如

int a; 
      float b; 
      b=a; 

有B就只存储的一个甚至如果计算值的整数值是浮点数。这里可能与你的表达式相同(i+j)/2.