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结果.为什么不呢?我应该读懂什么?
我的指针是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的别名也有很多问题和答案.