C++用reinterpret_cast转char*为int报loses precision错误含义是什么?
错误含义解释
这个编译错误的核心是提示你类型长度不匹配导致转换会丢失数据,具体原因如下:
- 你当前运行代码的环境是64位系统,64位环境下所有指针类型(这里的
char*属于指针)的长度是8字节,但C++标准中int的常规长度是4字节。将8字节的指针值强制塞进4字节的int变量中,必然会截断高位数据,导致最终拿到的整数值和原指针值不一致,也就是报错里提到的「loses precision(丢失精度)」。 - 后缀的
[-fpermissive]是提示你如果要强行忽略这个风险编译,可以在编译指令中加上-fpermissive参数放宽编译器校验,但非常不推荐这么做。
另外你的代码里还有一个隐藏的不规范写法:char *p = "This is a string";在C++11及更高版本标准中属于非法写法,字符串字面量本身是const char*类型,直接赋值给无const修饰的char*会丢弃常量限定符,也会触发编译警告或错误。
如果你确实需要将指针转为整数存储,正确的做法是使用标准库定义的和指针长度匹配的无符号整数类型uintptr_t,修改后代码如下:
#include <iostream> #include <cstdint> // 引入uintptr_t定义的头文件 using namespace std; int main() { uintptr_t i; const char *p = "This is a string"; // 补全const修饰 i = reinterpret_cast<uintptr_t>(p); cout << i; return 0; }
内容的提问来源于stack exchange,提问作者Arpitha Prakash
相关产品推荐
相关产品推荐

