※ 引述《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