首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >错误:从'void*‘到'int’的转换失去精度

错误:从'void*‘到'int’的转换失去精度
EN

Stack Overflow用户
提问于 2009-10-29 06:04:06
回答 16查看 151.1K关注 0票数 74

我有一个带有prototype void* myFcn(void* arg)的函数,它被用作pthread的起点。我需要将参数转换为int类型,以便以后使用:

代码语言:javascript
复制
int x = (int)arg;

编译器(GCC 4.2.4版)返回错误:

代码语言:javascript
复制
file.cpp:233: error: cast from 'void*' to 'int' loses precision

什么是正确的投射方式?

EN

回答 16

Stack Overflow用户

发布于 2009-10-29 06:13:40

您可以将其转换为intptr_t类型。它是一个int类型,保证足够大以包含一个指针。使用#include <cstdint>来定义它。

票数 70
EN

Stack Overflow用户

发布于 2011-08-26 21:37:25

再说一次,上面的所有答案都严重错失了要点。OP想要将指针值转换为int值,而大多数答案都试图将arg指针的内容错误地转换为int值。而且,这些方法中的大多数甚至不能在gcc4上工作。

正确的答案是,如果人们不介意失去数据精度,

代码语言:javascript
复制
int x = *((int*)(&arg));

这在GCC4上有效。

最好的方法是,如果可以的话,不要进行这样的强制转换,相反,如果必须为指针和int共享相同的内存地址(例如,为了节省RAM),请使用union,并确保只有当您知道内存地址最后被设置为int时,才将其视为int。

票数 34
EN

Stack Overflow用户

发布于 2009-10-29 06:09:13

而不是:

代码语言:javascript
复制
int x = (int)arg;

使用:

代码语言:javascript
复制
int x = (long)arg;

在大多数平台上,指针和长整型的大小相同,但整型和指针在64位平台上的大小通常不同。如果将(void*)转换为(long)不会丢失精度,则通过将(long)赋值给(int),它会正确地截断数字以使其适合。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1640423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档