答案:double型別參考:“隱式型別轉換”C++定義了一組內建的型別物件之間的標準轉換,在必要時它們被編譯器隱式的應用到物件上。在算式轉換保證了二元運算子,如加法或乘法的兩個運算元被提升為共同的型別,然後再用它表示結果的型別。兩個通用的指導原則如下: 1、為防止精度損失,如果必要的話,型別總是被提升為較寬的型別。 2、所有含有小於整形的有序型別的算術表示式在計算之前其型別都會被轉換成整形。 規則的定義如上面所述,這些規則定義了一個型別轉換層次結構,我們從最寬的型別long double 開始,那麼另一個運算元無論是什麼型別都將被轉換成long double .如果兩個操作數千不是long double 型,那麼若其中一個運算元的型別是double 型,則另一個就被轉換成double 型。例如: int ival; float fval; double dval; dval + fval + ival //在計算加法前fval和ival都被轉換成double 類似地,如果兩個運算元都不是double型而其中一個操作float型 ,則另一個被轉換成float型。例如: char cval; int ival; float fval; cval + ival + fval //在計算加法前ival和cval都被轉換成float 否則如果兩個運算元都不是3種浮點型別之一,它們一定是某種整值型別。在確定共同的目標提升型別之前,編譯器將在所有小於int 的整值型別上施加一個被稱為整值提升的過程。 在進行整值提升時型別char、signed char、unsigned char和short int 都被提升為型別int 。如果機器上的型別空間足夠表示所有unsigned short 型的值,這通常發生在short用半個字而int 用一個字表示的情況下,則unsigned short int 也被轉換成int 否則它會被提升為unsigned int 。wchar_t和列舉型別被提升為能夠表示其底層型別所有值的最小整數型別。在下列表達式中: char cval; bool found; enum mumber{m1,m2,m3}mval; unsigned long ulong; cval + ulong;ulong + found; mval + ulong;在確定兩個運算元被提升的公共型別之前,cval found 和mval都被提升為int 型別。 一旦整值提升執行完畢,型別比較就又一次開始。如果一個操作是unsigned long 型,則第二個也被轉換成unsigned long 型。在上面的例子中所有被加到ulong上的3個物件都被提升為unsigned long 型。如果兩個操作型別都不是unsigned long 而其中一個操作long型,則另一個也被轉換成long型。例如: char cval; long lval; cval + 1024 + lval; //在計算加法前cval和1024都被提升為long型 。 long型別的一般轉換有一個例外。如果一個操作long型而另一個是unsigned int 型,那麼只有機器上的long型的長度足以unsigned int 的所有值時(一般來說,在32位作業系統中long型和int 型都用一長表示,所以不滿足這裡的假設條件),unsigned int 才會被轉換為long型,否則兩個運算元都被提升為unsigned long 型。若兩個運算元都不是long型而其中一個是unsigned int 型 ,則另一個也被轉換成unsigned int 型,否則兩個運算元一定都是int 型。 儘管算術轉換的這些規則帶給你的困惑可能多於啟發,但是一般的思想是儘可能地保留型別表示式中涉及到的值的精度。這下是透過把不同的型別提升到當前出現的最寬的型別實現的。
答案:double型別參考:“隱式型別轉換”C++定義了一組內建的型別物件之間的標準轉換,在必要時它們被編譯器隱式的應用到物件上。在算式轉換保證了二元運算子,如加法或乘法的兩個運算元被提升為共同的型別,然後再用它表示結果的型別。兩個通用的指導原則如下: 1、為防止精度損失,如果必要的話,型別總是被提升為較寬的型別。 2、所有含有小於整形的有序型別的算術表示式在計算之前其型別都會被轉換成整形。 規則的定義如上面所述,這些規則定義了一個型別轉換層次結構,我們從最寬的型別long double 開始,那麼另一個運算元無論是什麼型別都將被轉換成long double .如果兩個操作數千不是long double 型,那麼若其中一個運算元的型別是double 型,則另一個就被轉換成double 型。例如: int ival; float fval; double dval; dval + fval + ival //在計算加法前fval和ival都被轉換成double 類似地,如果兩個運算元都不是double型而其中一個操作float型 ,則另一個被轉換成float型。例如: char cval; int ival; float fval; cval + ival + fval //在計算加法前ival和cval都被轉換成float 否則如果兩個運算元都不是3種浮點型別之一,它們一定是某種整值型別。在確定共同的目標提升型別之前,編譯器將在所有小於int 的整值型別上施加一個被稱為整值提升的過程。 在進行整值提升時型別char、signed char、unsigned char和short int 都被提升為型別int 。如果機器上的型別空間足夠表示所有unsigned short 型的值,這通常發生在short用半個字而int 用一個字表示的情況下,則unsigned short int 也被轉換成int 否則它會被提升為unsigned int 。wchar_t和列舉型別被提升為能夠表示其底層型別所有值的最小整數型別。在下列表達式中: char cval; bool found; enum mumber{m1,m2,m3}mval; unsigned long ulong; cval + ulong;ulong + found; mval + ulong;在確定兩個運算元被提升的公共型別之前,cval found 和mval都被提升為int 型別。 一旦整值提升執行完畢,型別比較就又一次開始。如果一個操作是unsigned long 型,則第二個也被轉換成unsigned long 型。在上面的例子中所有被加到ulong上的3個物件都被提升為unsigned long 型。如果兩個操作型別都不是unsigned long 而其中一個操作long型,則另一個也被轉換成long型。例如: char cval; long lval; cval + 1024 + lval; //在計算加法前cval和1024都被提升為long型 。 long型別的一般轉換有一個例外。如果一個操作long型而另一個是unsigned int 型,那麼只有機器上的long型的長度足以unsigned int 的所有值時(一般來說,在32位作業系統中long型和int 型都用一長表示,所以不滿足這裡的假設條件),unsigned int 才會被轉換為long型,否則兩個運算元都被提升為unsigned long 型。若兩個運算元都不是long型而其中一個是unsigned int 型 ,則另一個也被轉換成unsigned int 型,否則兩個運算元一定都是int 型。 儘管算術轉換的這些規則帶給你的困惑可能多於啟發,但是一般的思想是儘可能地保留型別表示式中涉及到的值的精度。這下是透過把不同的型別提升到當前出現的最寬的型別實現的。