为什么int指针给我浮点数?

Via*_*iuk -1 c c++ pointers casting

我有这样的代码:

double x = 100.1;
double y;
int *p;

p = (int *) &x;
y = *p;

cout << "y value is: " << y << endl;
Run Code Online (Sandbox Code Playgroud)

我知道这是错误的,我们得到4个字节而不是8个字节.我也知道浮动数字在内存中有一些棘手的表示(但不知道如何),但是这个脚本给了我这样的输出:

y value is: 1.71799e+09
Run Code Online (Sandbox Code Playgroud)

据我所知,它也具有浮点值.我的指针是int,我也期望int结果.为什么不呢?我应该读懂什么?

bam*_*s53 6

我的指针是int,我也期望int结果.为什么不呢?

因为y是双重的,而不是int.现在,如果你想问为什么没有y一个整数值,因为它应该是一个int(必须*有一个整数值)转换为double的结果,看看下面的输出:

std::cout << "y value is: " << std::fixed << y << '\n';
Run Code Online (Sandbox Code Playgroud)

您应该看到的输出是:

y value is: 1717986918.000000
Run Code Online (Sandbox Code Playgroud)

因此,y 确实有一个整数值,您只需使用科学记数法将其打印出来.如果你想知道为什么y有这个特殊的积分值,那是因为价值*p就是这个.

std::cout << "*p is: " << *p << '\n';

*p is: 1717986918
Run Code Online (Sandbox Code Playgroud)

如果你看一下内存转储x具有的价值100.1,你会看到:

66 66 66 66 66 06 59 40
Run Code Online (Sandbox Code Playgroud)

当你以int形式访问它时,你会得到66 66 66 66,转换为十进制,是1717986918.


还有一点需要注意的是,C++不能保证这一点.实际上,您的程序实际上并不合法,因为当您x通过指向int的指针访问double时,您违反了别名规则.您的程序可以合法并获得相同的结果,但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的别名也有很多问题和答案.