私のポインタはintであり、intの結果も期待しています。なぜそうではないのですか?
y
int ではなく double であるためです。ここで、整数値を持たない理由を尋ねるつもりなら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
、10 進数に変換すると 1717986918 になります。
もう 1 つ注意すべき点は、これは C++ では保証されていないということです。x
実際、 int へのポインターを介してdouble にアクセスすると、エイリアシング規則に違反しているため、プログラムは実際には合法ではありません。あなたのプログラムは合法的に作られ、同じ結果を得ることができますが、C++ は浮動小数点値の表現を指定していないため、特定の整数値は合法的に異なる可能性があります。
理解するために何を読むべきですか?
これはフロートの表現で遊ぶ記事です: http://ridiculousfish.com/blog/posts/float.html
C++ は float の表現方法を指定していませんが、ほとんどの C++ 実装は IEEE-754 を使用しているため、その仕様も参照してください。これを始めるためのウィキペディアのページは次のとおりです: https://en.wikipedia.org/wiki/IEEE_floating_point
C++ のエイリアシング規則について学ぶには、仕様を見つけて読むことができます。厳密なエイリアシングは、§3.10/10、IIRC でカバーされています。SO では、エイリアシングに関する多くの質問と回答もあります。