【问题标题】:error: cast from ‘...’ to ‘unsigned int’ loses precision [-fpermissive]错误:从“...”转换为“unsigned int”会丢失精度 [-fpermissive]
【发布时间】:2014-10-19 06:53:12
【问题描述】:

在我的代码中,Graph 是一个具有成员 node 的类,它是一个结构。当我这样做时

unsigned int id  = ((unsigned int)n - (unsigned int)_nodes) / sizeof(Graph::node); 

我收到以下错误(在 64 位 Linux 上编译):

error: cast from ‘Graph::node* {aka Graph::node_st*}’ to ‘unsigned int’ loses precision [-fpermissive]

谷歌搜索并找到了similar question,但在我看来答案不适用于此处(请注意,我想获取对象的大小而不是自身)。

提前感谢您的任何建议!

【问题讨论】:

  • 你为什么要把指针指向unsigned long
  • 如果n_nodes 都是指向Graph::node 的指针,并且都指向同一个内存区域,那么您不必进行任何转换。
  • 您将 64 位指针投射到 unsigned int,这很可能是 32 位。
  • 在(大多数)64 位 Linux 上,指针是 64 位长,无符号整数是 32 位长。所以错误信息是完全正确的。
  • 问题已解决。非常感谢 0x499602D2、Joachim、Jonathan 和 Tom 的 cmets。

标签: c++ casting


【解决方案1】:

如果n_nodes 指向Graph::node,即它们的类型为Graph::node *(从错误消息中似乎是这种情况),并且if 你想要要根据 Graph::node 元素的数量计算两者之间的“距离”,您可以这样做:

unsigned int id = n - _nodes;

在 C 和 C++ 中,指针运算将导致差异是元素数(而不是字节数)。

为了使其可移植地工作,n_nodes 都必须指向一个连续的 Graph::node 值块,并且 n 应该在“之后”_nodes。如果你能得到负面的差异,你可以使用ptrdiff_t类型而不是unsigned int

【讨论】:

  • 像魅力一样工作。非常感谢,阿洛克!
【解决方案2】:

first answer in the SO post you have a link to 提供了一个适合您的答案。

使用

intptr_t id  = ((intptr_t)n - (intptr_t)_nodes) / sizeof(Graph::node); 

【讨论】:

  • 嗨萨胡。感谢您的回答。此解决方案有效。但是就我而言,我认为@Alok 的解决方案更优雅。 +1
猜你喜欢
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
相关资源
最近更新 更多