错误:从'...'转换为'unsigned int'会丢失精度[-fpermissive]

时间:2014-08-26 03:17:58

标签: c++ casting

在我的代码中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]

用Google搜索并找到similar question,但在我看来答案在这里并不适用(请注意,我想获得对象的大小,但不是自己)。

提前感谢您的任何建议!

2 个答案:

答案 0 :(得分:2)

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

unsigned int id = n - _nodes;

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

为了便于移植,n_nodes都必须指向Graph::node值的连续块,而n应该在“{{1}之后” }。如果您可以获得负面差异,则可以使用_nodes类型而不是ptrdiff_t

答案 1 :(得分:1)

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

使用

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