我的指針是int,我也期待int結果。爲什麼不是?
因爲y
是一個double,而不是一個int。現在,如果你的意思是要問爲什麼y
有一個整數值,因爲它應該是一個int(必須有一個整數值)轉換成double的結果,請看下面的輸出:
std::cout << "y value is: " << std::fixed << y << '\n';
你應該看到的輸出是:
y value is: 1717986918.000000
所以,y
確實有一個整數值,只需用科學記數法打印出來。如果你想知道爲什麼y
具有這個特定的整數值,那是因爲這是*p
的值。
std::cout << "*p is: " << *p << '\n';
*p is: 1717986918
如果你要看看x
與100.1
值內存轉儲,您將看到:
66 66 66 66 66 06 59 40
當你訪問這個作爲一個int,你66 66 66 66
,其中,轉換爲十進制,是1717986918.
另一個需要注意的是,這些都不是由C++保證的。實際上,你的程序實際上並不合法,因爲當你通過指向int的指針訪問雙重x
時,你違反了別名規則。您的程序可以合法並獲得相同的結果,但C++並未指定浮點值的表示,因此特定的整數值在法律上可能不同。
我應該怎麼看的懂?
這裏是與彩車的表現起着文章:http://ridiculousfish.com/blog/posts/float.html
C++沒有規定如何花車表示,但大多數C++實現使用IEEE-754,所以你也可以看一看那規範。以下是維基百科頁面的開始:https://en.wikipedia.org/wiki/IEEE_floating_point
要了解C++的別名規則,您可以找到並閱讀規範。 IIRC§3.10/ 10中涵蓋嚴格的別名。關於SO的別名還有很多問題和答案。
你*得到了一個int結果。它只是使用僅適用於double的表示形式進行了格式化。因爲這是cout在傳遞double類型的變量時所做的。當然還有一個隨機值,在+/- 20億之間。 –
整數約爲1717990000(由於您注意到的棘手錶示)。然後您將其轉換爲浮點並打印出來。 –
GIGO。 (對於那裏的孩子來說,這是一個古老的計算術語,代表垃圾進入,垃圾進出) –