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

C++ 为什么int指针给我浮点数?,c++,c,pointers,casting,C++,C,Pointers,Casting,我有这样的代码: double x = 100.1; double y; int *p; p = (int *) &x; y = *p; cout << "y value is: " << y << endl; 据我所知,它也是浮点值。我的指针是int,我也期望int结果。为什么不是呢?我应该读什么才能理解?当你读的时候 y = *p; 变量y取p指向的int,然后将其转换为double 假设sizeofdouble为8,sizeofint为4

我有这样的代码:

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

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

cout << "y value is: " << y << endl;
据我所知,它也是浮点值。我的指针是int,我也期望int结果。为什么不是呢?我应该读什么才能理解?

当你读的时候

y = *p;
变量y取p指向的int,然后将其转换为double

假设sizeofdouble为8,sizeofint为4

做x=100;您将x中的双精度值100放在8个字节上。当你做y=*p;您将只使用8个字节中的4个作为int值,然后将该数字转换为double

double和int的二进制格式是不同的。例如,100作为double与100 int的表示方式不同,更不用说大小差异了,例如8对4

1.71799e+09是整数1717,99x,xxx的浮点表示形式

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

您的指针是int*,您将得到一个int结果

但这不是你要展示的。您正在显示y,它是双精度的

1.71799e+09是整数的双重表示形式


使用指针进行转换是不明智的

< P>读取C++指针和数据类型文档


运行以下行时,您正在触发未定义的behavoir:

p = (int *) &x;
一旦你触发了未定义的行为,你的问题的其余部分就毫无意义了,因为关于未定义行为的推理是没有意义的,尽管看看你问题的其余部分,这可能是因为这一点未定义的行为不会影响你真正问的问题。不过我不确定

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

因为y是双精度的,而不是整数。现在,如果你想问为什么y没有整数值,因为它应该是整数值转换为双精度的整数的结果,请看下面的输出:

std::cout << "y value is: " << std::fixed << y << '\n';
所以,y有一个整数值,你只需要用科学的符号把它打印出来。如果你想知道为什么y有这个特殊的积分值,那是因为p有这个值

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

另一个需要注意的是,这些都不是由C++保证的。事实上,你的程序实际上是合法的,因为当你通过int指针访问双x时,你违反了混淆规则。你的程序可以合法化,得到相同的结果,但是C++没有指定浮点值的表示,所以特定的积分值在法律上可能是不同的。 我应该读什么来理解

下面是一篇关于浮动表示的文章:

C++没有指定浮点的表示方式,但是大多数C++实现使用IEEE-74,所以您也可以看看该规范。以下是wikipedia页面,让您开始了解:


要了解C++的别名规则,您可以查找并阅读规范。严格别名在§3.10/10,IIRC中有介绍。这里还有很多关于别名的问题和答案。

您确实得到了一个int结果。它只是使用了一种仅适用于double的表示形式进行格式化。因为当你传递一个double类型的变量时,cout就是这么做的。当然有一个随机值,在+/-20亿之间。由于您注意到的复杂表示,整数约为1717990000。然后将其转换为浮点并打印。GIGO。对于孩子们来说,这是一个古老的计算术语,代表内存中的垃圾输入、垃圾输出位,除非在一些非常早期的标记内存系统中,这些系统不是int、浮点、char或任何特殊的东西。它们的含义由用于引用内存中位置的变量名和类型提供。在上面的示例中,您在使用浮点变量引用该值时打印了该值,因此它就是这样打印的。@viakondratiuk p=int*&x;需要什么;。这是对整型指针的类型转换吗?在这种情况下,出于我个人的好奇,您可能会在注释中添加它,为什么将整型指针转换为浮点指针是一种未定义的行为?取消引用这样的指针可能依赖于实现,但是否强制转换?标准的哪一部分?虽然这可能是真的,但它并没有真正回答这个问题。@Devolus:这个问题的答案我也希望得到int的结果。为什么不是呢?就是这样。1.71799e+09是一个整数,表示为双精度。它没有分数成分。啊,现在我明白你的意思了。使用reinterpret_cast并不能使代码更加正确;这仍然是一个别名冲突,而且这个特殊的C样式转换碰巧是根据reinterpret_cast定义的。我说它会更清楚地解释它是指针的重新解释,我认为它是。如果你认为一个新手对int*的理解同样清晰,那么就感觉f
我想说的是,你说正确的C++是…,但是它没有更正确。好,我已经编辑过了。我已经添加了一段关于它不是好代码的部分。如果你不投票,你应该留下评论。问题是我应该读什么来理解?
y = (int)x; 
p = (int *) &x;
std::cout << "y value is: " << std::fixed << y << '\n';
y value is: 1717986918.000000
std::cout << "*p is: " << *p << '\n';

*p is: 1717986918
66 66 66 66 66 06 59 40