关于intptr_t,64位linux系统中void *与int转换

来源:互联网 发布:逻辑回归的数据集 编辑:程序博客网 时间:2024/05/09 12:48

intptr_t是为了跨平台,其长度总是所在平台的位数,所以用来存放地址。


学习linux多线程时看别人的示例代码直接将void * 转化为int,在自己的程序中也这样写可是提示

error: cast from 'void*' to 'int' loses precision [-fpermissive]。


经过学习,在32位系统中上述转换是可以的,因为在32位系统中int为4字节,地址也为4字节,所以可以直接转换,不会损失精度。

但是在64位系统中,int依旧为4字节,但是地址已经变为64位了,所以直接转换会损失精度。

解决办法:

(1)这时就可以使用intptr_t来进行转换,因为intptr_t就是为了跨平台而存在的,总是所在平台的位数,不会损失精度。
(2)另一种方法是使用unsigned long 来进行转换,因为unsigned long 在32位平台是4字节,在64位平台占用8字节,与地址占用字节数相同也不会损失精度,所以也可以。



参考文章:

intptr_t详解:http://blog.csdn.net/macchan/article/details/38701811
C语言指针转换为intptr_t类型:http://www.cnblogs.com/Anker/p/3438480.html


0 0
原创粉丝点击