我的指针是 int ,我也期望 int 结果。为什么不是?
因为y
是双精度,而不是整数。现在,如果您要问为什么没有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++ 无法保证这些。事实上,您的程序实际上并不合法,因为当您x
通过指向 int 的指针访问双精度时,您违反了别名规则。您的程序可以合法并获得相同的结果,但 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 上也有很多关于别名的问题和答案。