d
是double
类型的数据,p
是指向它的指针。当将两者分别显式转换为int时,对于指针p的转换都会产生以下错误。
:
从double*
投射到int
会失去精度
#include<iostream>
using namespace std;
int main()
{
int i,j;
double d=3.5;
double* p=&d;
i=(int)d;
j=(int)p; // this line gives the error
cout<<i<<" "<<j;
return 0;
}
我希望那里的错误
“从double*
到int
的无效转换。为什么不是这样?
而且,如果对指针p
进行强制转换,为什么数据d不会给出“丢失精度”错误呢?
答案 0 :(得分:1)
我希望该错误是“从'double *'到 'int'”。为什么不是这样?
我认为这只是处理此错误的依赖于编译器的方式。在c上,我得到了类似的东西,也许更有用:
error: cast from pointer to smaller type 'int' loses information
此外,为什么对数据d进行强制转换时未给出“丢失精度”错误 是否对指针p这样做?
从float或double到int的转换属于标准转换,并非错误,有时是有用的。这应该不会引发错误,更多的是here,
浮点类型的prvalue可以是 转换为任何整数类型的prvalue。小数部分是 截断,即小数部分被丢弃。如果值 无法适应目标类型,行为未定义(甚至 当目标类型为无符号时,模运算不 应用)。如果目标类型为bool,则为布尔转换 (见下文)。
整数或非范围枚举类型的prvalue可以是 转换为任何浮点类型的prvalue。如果值不能 正确表示,这是实现定义的 最接近的较高值或最接近的较低可表示值将是 选择,尽管如果支持IEEE算术,则舍入默认值 到最近。如果该值不能适合目标类型,则 行为是不确定的。如果源类型为bool,则值false为 转换为零,并且值true转换为1。
答案 1 :(得分:1)
您从Poiner p转换为int。这正在缩小惯例。您将拥有一部分内存地址。您还期望什么?
答案 2 :(得分:0)
int
不能保证能够保存指针的值。对于您的情况,我相信intptr_t
会起作用。
答案 3 :(得分:-1)
您失去精确度,这很容易解释。
在这种情况下,您这样做有两个原因。
行错误的原因是因为您试图将指针转换为整数,这是不可能的,您要做的是j = (int)*p;
您的代码中存在几种不良做法。
https://isocpp.org/wiki/faq/coding-standards#using-namespace-std
How to use an iterator?(导致问题的示例)
Confusion about pointers and references in C++(另一个引起问题的示例;使用std :: swap;也将引起相同的确切问题)
(type)
,在您的情况下为(int)
在C ++中,应使用2个主要的强制类型转换:static_cast和reinterpret_cast。
(还有2种类型,const_cast和dynamic_cast,但是在这种情况下它们是无关紧要的,几乎不应该使用const_cast)两者都使用模板参数作为结果类型。
在这种情况下,您可能可以i = static_cast<int>(d);
对于第二个强制转换j =,您应该(实际上,您不应该将指针强制转换为其他类型)
j = *reinterpret_cast<int*>(p);
当然,将双精度型转换为整数并不是很好,但这应该可以解决编译器错误。