对于intptr_t和uintptr_t的理解

摘要:
intptr_t、uintptr_r变量类型用于保证不同机器字长整数与指针相互转移的的通用性。下面给出合理的解释:先给出不同的数据类型在不同字长机器上长度大小可以看到,对于32位和64位机器而言,longint确实可以避免,因为和指针的长度一直保持一致,但是对于16位机器而言却不再适用。因为在16位机器下longint不是2个字节,而是4个字节。

intptr_t、uintptr_r变量类型用于保证不同机器字长(16位、32位、64位)整数与指针相互转移的的通用性。

在这里可能会有人发出疑问:long int在32位机器上是32位,在64位机器上是64位,直接用long int不就可以避免不同机器的之间指针长度的差异了吗?下面给出合理的解释:

先给出不同的数据类型在不同字长机器上长度大小

对于intptr_t和uintptr_t的理解第1张

可以看到,对于32位和64位机器而言,long int确实可以避免,因为和指针的长度一直保持一致,但是对于16位机器而言却不再适用。因为在16位机器下longint不是2个字节,而是4个字节。

然后我们可以再看intptr_t和uintptr_t的定义:

/*Types for `void *' pointers.  */
#if __WORDSIZE == 64# ifndef __intptr_t_defined
typedef long intintptr_t;
#  define __intptr_t_defined
# endif
typedef unsigned long intuintptr_t;
#else# ifndef __intptr_t_defined
typedef intintptr_t;
#  define __intptr_t_defined
# endif
typedef unsigned intuintptr_t;
#endif

上面的定义在linux下的/usr/include/stdint.h中可以找到,通过定义可以发现,在64位机器下intptr_t为long int,而对于非64位的机器,即32位和16位机器,intptr_t被定义为int(unitptr_t同理),可以很好的保证intptr_t的长度与机器的指针长度一致,因此在进行整数与指针的相互转换时可以用intptr_t进行过渡。正如注释/* Types for `void *' pointers. */所言。

免责声明:文章转载自《对于intptr_t和uintptr_t的理解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇activiti学习总结用Go写Windows桌面应用 使用Form下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

dev -c++ 快捷键

转自:http://blog.csdn.net/abcjennifer/article/details/7259222 F8:开始调试 F7:进一步执行当前行,并跳到下一行 F4:添加查看 ctrl + F7 跳到下一断点, shift + F4 跳到光标所在行,并在该行设置断点 用鼠标选择源文件中的变量名,然后按 F4 也可以查看变量的值,该变量会出现...

iOS中Block的用法,举例,解析与底层原理

1. 前言 Block:带有自动变量(局部变量)的匿名函数。它是C语言的扩充功能。之所以是拓展,是因为C语言不允许存在这样匿名函数。 1.1 匿名函数 匿名函数是指不带函数名称函数。C语言中,函数是怎样的呢?类似这样: int func(int count); 调用的时候: int result = func(10); func就是它的函数名。也可以通...

C语言动态内存分配

C语言动态内存分配:堆不连续 栈连续 动态内存分配: 1.从静态存储区域中分配(系统自己分配) 2.从堆内存中分配(动态内存分配) 3.在栈中进行分配(系统自己分配) 动态内存分配和释放函数: malloc函数 calloc函数 recalloc函数 free函数 常见内存分配错误: 使用未分配的内存 引用了分配成功但尚未初始化的内存 内存分配且初始化了,...

寒假作业3:抓老鼠啊~亏了还是赚了?(指针法)

7-1 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X)。捕鼠夹可重复利用,不计成本,奶酪每块3元。聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥: 若什么也没有(X...

谈C/C++ 指针精髓 CHRIS

指针是C和C++语言编程中最重要的概念之一,也是最容易产生困惑并导致程序出错的问题之一。利用指针编程可以表示各种数据结构, 通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯;并能像汇编[url=javascript:;]语言[/url]一样处理内存[地址从而编出精练而高效的程序。指针极大地丰富了C和C++语言的功能。 ­ ­ 在...

STM32---喜提点灯

一:编译第一个程序 intmain()  //主函数 { } voidSystemInit()  //在执行主函数前,会被调用。不进行实现。在启动文件中被调用 { } ; Reset handler Reset_Handler PROC EXPORT Reset_Handler...