intptr_t

一、数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小,只规定级别。作下比较:

16位平台

char 1个字节8位

short 2个字节16位

int 2个字节16位

long 4个字节32位

指针 2个字节

32位平台

char 1个字节8位

short 2个字节16位

int 4个字节32位

long 4个字节

long long 8个字节

指针 4个字节

64位平台

char 1个字节

short 2个字节

int 4个字节

long 8个字节(区别)

long long 8个字节

指针 8个字节(区别)

二、编程注意事项

为了保证平台的通用性,程序中尽量不要使用long数据库型。可以使用固定大小的数据类型宏定义,这些宏定义需要引用stdint.h头文件:

typedef signed char int8_t

typedef short int int16_t;

typedef int int32_t;

三、使用int时也可以使用intptr_t来保证平台的通用性,它在不同的平台上编译时长度不同,但都是标准的平台字长,比如64位机器它的长度就是8字节,32位机器它的长度是4字节,使用它可以安全地进行整数与指针的转换运算,也就是说当需要将指针作为整数运算时,将它转换成intptr_t进行运算才是安全的。intptr_t需要引用stddef.h头文件,它的定义如下:

#if __WORDSIZE == 64
typedef long int intptr_t;
#else
typedef int intptr_t;
#endif
编程中要尽量使用sizeof来计算数据类型的大小

以上类型定义都有相应的无符号类型。

四、使用ssize_t和size_t

它们分别是unsigned和signed size of computer word size。它们也是表示计算机的字长,在32位机器上是int型,在64位机器上long型。使用它们对于增加平台的通用性有很大好处,从某种意义上来说它们等同于intptr_t和uintptr_t。使用它们也需要引用stddef.h头文件。

五、socket的accept函数在有些操作系统上使用size_t是不正确的,因为accept接收的int类型,而size_t的长度可能会超过int的长度限制,导致错误。后来BSD使用sock_t来替代它。

关于 intptr_t相关推荐

  1. C语言指针转换为intptr_t类型

    C语言指针转换为intptr_t类型 1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类 ...

  2. intptr_t详解

    看leveldb代码时候发现inptr_t居然不知道是啥,搜索了一番发现一个比较官方的解释: 尽管大部分程序员习惯自由使用标准类型, 如 int 和 long, 编写设备驱动需要一些小心来避免类型冲突 ...

  3. 关于 uintptr_t和intptr_t 类型

    简介 最近在看代码时,发现了两个之前没见过的数据类型:intptr_t,uintptr_t.这两个数据类型是ISO C99定义的,具体代码在linux平台的/usr/include/stdint.h头 ...

  4. 【笔记】_findnext x64报错解决办法:改为 intptr_t handle; //x64

    用 _findfirst 和 _findnext 查找文件: long handle;     struct _finddata_t fileinfo; nsFile = nsPath + " ...

  5. OpenCV 畸变校正函数undistortPoints()与remap()详解及校正效果对比

    一.概述 前面写过一篇博客–"疑问:undistortPoints()与remap()畸变校正后,结果相差很大",博客中对比了OpenCV中自带畸变校正函数undistortPoi ...

  6. C++ OpenCV创建xml,yml文件(图像)列表程序

    最近在学习关于相机标定的程序,标定时需要将图片打包成XML YML TXT格式,下面贴出生成xml图像序列的程序,同样适用于yml,记录一下,欢迎讨论~ #include "opencv2/ ...

  7. C++ Opencv 读取指定路径中的所有文件(图片)及指定路径中指定格式的所有文件(图片)

    读取指令路径下的所有文件,程序如下: #include <io.h> #include < fstream> #include < string> #include ...

  8. bash脚本【一】——批量处理文件

    Bash脚本2.0 #!/bin/bashoutput_root_dir="0723weixin" data_root_dir="D:/data/"$outpu ...

  9. Redis源码和java jdk源码中hashcode的不同实现

    一.redis实际上是使用了siphash 这个比较简单,我说的简单是指redis代码比较少不像jdk一样调用C++代码调用栈非常深. 先看这个rehashing.c 主要就是dictKeyHash函 ...

  10. Nginx源码分析--数据对齐posix_memalign和memalign函数

    posix_memalign函数() /*  * 背景:  *      1)POSIX 1003.1d  *      2)POSIX 标明了通过malloc( ), calloc( ), 和 re ...

最新文章

  1. IBM Bluemix云计算大会见闻
  2. 制作TortoiseSVN最新版本的中文DLL(转)
  3. Python之自动单元测试之一(unittest使用实例)
  4. 中国古代天文星象学的入门书:《步天歌》
  5. IndexTank全文检索引擎设计分析
  6. 【Flink】Flink Not all required tasks are currently running
  7. 穿山甲插屏广告居中_穿山甲跻身广告联盟头部阵营 如何实现增量创新?
  8. android 安全学习从何入手?
  9. Dev-Cpp 切换界面语言中文
  10. 重启网卡报错Job for network.service failed because the control process exited with error code.
  11. __imp__ZN11QSerialPortC1EP7QObject
  12. Python 网络爬虫实现 QQ 音乐下载
  13. 快速查询快递单号物流的方法有哪些?
  14. Android UI 显示工具——HierarchyViewer工具
  15. aria2 32bit Android,【各版本整合】32/64位Aria2 Tools - 支持RPC协议 AriaNG(客户端+网页版)...
  16. php微信调用天气api,微信公众号接口开发--snoweek测试
  17. 基于51单片机的数字时钟(万年历)
  18. Q390GJE低合金高强度钢简介
  19. xampp 403 禁止访问 问题解决
  20. java 适配器_java适配器

热门文章

  1. joystick手柄驱动安卓_万能手柄驱动(PPJOY) 官方版 (图文)
  2. QQ在线客服代码(不需要加好友即可发起临时会话)
  3. ctfmon是什么启动项_我MSCONFIG启动项里面没有ctfmon怎么处理?
  4. Android如何获取唯一ID
  5. 面向对象程序设计———大花园
  6. GreenSock (TweenMax) 动画案例(一)
  7. 项目连接DB2报错:必需的字符转换器不可用。 ERRORCODE=-4220, SQLSTATE=null
  8. mybatis 链接DB2查询报错,必需的字符转换器不可用。 ERRORCODE=-4220, SQLSTATE=null
  9. 【时间序列分析】02. 线性平稳序列
  10. 一个被加入下载QQ盗号木马Trojan.PSW.QQPass.rie代码的网站