从double *转换为int会失去精度

时间:2019-06-07 15:29:58

标签: c++ casting int double

ddouble类型的数据,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不会给出“丢失精度”错误呢?

4 个答案:

答案 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)

您失去精确度,这很容易解释。

在这种情况下,您这样做有两个原因。

  1. 一个整数只有4个字节,而一个双精度数只有8个字节,这意味着您不能将整个双精度数放入整数。 (实际上是实现的定义)
  2. 双精度数有十进制数字,整数没有十进制数字,因此整数根本无法保存有关十进制数字的信息。

行错误的原因是因为您试图将指针转换为整数,这是不可能的,您要做的是j = (int)*p;

您的代码中存在几种不良做法。

  1. 使用命名空间std; Why is "using namespace std;" considered bad practice?

https://isocpp.org/wiki/faq/coding-standards#using-namespace-std

How to use an iterator?(导致问题的示例)

Confusion about pointers and references in C++(另一个引起问题的示例;使用std :: swap;也将引起相同的确切问题)

  1. C风格的演员表 这是(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);

当然,将双精度型转换为整数并不是很好,但这应该可以解决编译器错误。