對於intptr_t和uintptr_t的理解


intptr_t、uintptr_r變量類型用於保證不同機器字長(16位、32位、64位)整數與指針相互轉移的的通用性。

在這里可能會有人發出疑問:long int在32位機器上是32位,在64位機器上是64位,直接用long int不就可以避免不同機器的之間指針長度的差異了嗎?下面給出合理的解釋:

先給出不同的數據類型在不同字長機器上長度大小

 可以看到,對於32位和64位機器而言,long int確實可以避免,因為和指針的長度一直保持一致,但是對於16位機器而言卻不再適用。因為在16位機器下long int不是2個字節,而是4個字節。

 然后我們可以再看intptr_t和uintptr_t的定義:

/* Types for `void *' pointers. */
#if __WORDSIZE == 64 # ifndef __intptr_t_defined typedef long int intptr_t; # define __intptr_t_defined # endif typedef unsigned long int uintptr_t; #else # ifndef __intptr_t_defined typedef int intptr_t; # define __intptr_t_defined # endif typedef unsigned int uintptr_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. */ 所言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM