精華區beta ESOE-90 關於我們 聯絡資訊
※ 引述《kimuro (3/19視小造洋之夜)》之銘言: : float a = 3.14159; : 我打float會出現一個warning : 說什麼warning C4305: 'initializing' : truncation : from 'const double ' to 'float ' : 打double就可以說 這個解釋起來有點麻煩... C 有所謂的型別轉換 (type conversion). 它可以依循一定的規則... 轉換 C 語言內定的資料型態 (type). 比如說整數轉小數, 字元轉浮點數, 指標轉整數等等. type conversion 還分幾種... 在這裡出現的其實是一個 assignment conversion. 也就是一旦左右兩端的 expression 具有不同 type. 那麼等號右邊的 type 會被強制轉換為左邊的 type... 接下來是常數 3.14159 的問題... 常數也具有 type... 而在 C 裡頭, 浮點數的常數內定為 type double. 所以在這裡就會出現了一個... 將 type double 轉成 type float 的 assignment conversion. type double 的精確度會高於或者等於 type float. 通常的情況下, type double 的精確度是比較高的. 於是 type double 轉為 type float 就會發生幾種狀況. ... ... ... 這些狀況就不列了... 而你的 C compiler 則是在警告你... 程式裡頭出現了一個將較高精確度轉為較低精確度的 conversion. 這個 conversion 可能會造成某個運算喪失精確度. 3.14159 可能會變為 3.1416 之類的... 而這種行為是 ANSI C 所容許的. 更進一步來說, 一旦你用的變數是 type float... 那麼它永遠也只能具有 type float 的精確度. 不管有沒有這個 warning message 都一樣. 把它寫成 float a = (float)3.14159; float a = 3.14159f; 可以消除 warning... 但是, a 的值還是只能跟寫成 float a = 3.14159 相同. 因此有的 C compiler 並不會警示這種必然發生的情形. VC 會提很多 warning, 但是它的 warning 不見得正確... 實際上我們用的 Visual C++ 是 non-ANSI C compiler. 它的 warning 有相當數量可以不予理會. 太在意 VC, 那麼你學的很容易就變成 C under VC compiler... 而不是一般化的 ANSI C. 當然, 判斷這些東西並不在初學者的能力以內. 暫時只要心裡面有個譜就好了. 回到原本的主題... 真正要討論一個完整的 type conversion... 必須分別討論所有的 C operator(+ - * / () [] sizeof ...). 所以說... 其實很複雜. -- 新詩練習:新鮮。踩破初春裡的狗大便;不經意的滄桑,滿溢著嫩黃的喜悅。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.224.165.17