2010-10-26 75 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.