intptr t uintptr t資料型別的解析

2021-09-24 18:05:09 字數 1177 閱讀 9439

附屬實驗:

printf(" p_size = %d \n", sizeof(void *));

printf(" long_size = %d \n", sizeof(long int));

正文開始 :

最近開始研讀nginx的源**,首先就遇到如下的**:

typedef  intptr_t      ngx_int_t;

typedef  uintptr_t    ngx_uint_t;

intptr_t和uintptr_t是什麼型別?以前沒見過,於是查了一下。

這兩個資料型別是iso c99定義的,具體**在linux平台的/usr/include/stdint.h標頭檔案中。

該標頭檔案中定義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

在64位的機器上,intptr_t和uintptr_t分別是long int、unsigned long int的別名;在32位的機器上,intptr_t和uintptr_t分別是int、unsigned int的別名。

那麼為什麼要用typedef定義新的別名呢?我想主要是為了提高程式的可移植性(在32位和64位的機器上)。很明顯,上述**會根據宿主機器的位數為intptr_t和uintptr_t適配相應的資料型別。

另外,如注釋所言,定義這兩個資料型別別名也是為了「void *」指標。

在c語言中,任何型別的指標都可以轉換為void *型別,並且在將它轉換回原來的型別時不會丟失資訊。

AJAX返回資料型別是String型別解決辦法

今天編寫ajax時候出現了success function rs 返回的引數無法呼叫 前端 示例 驗證id是否存在 function checkid type post datatype json success function rs error function 後端 出問題 片段 succes...

資料型別基礎資料型別

資料型別 基礎型別 除八大基礎型別其他的都是引用型資料型別 引用資料型別 基礎資料型別 整型 byte 佔乙個位元組,範圍 128 127 short 佔兩個位元組,範圍 32768 32767 int 最常用 佔四個位元組,範圍 2147483648 2147483647 long 佔八個位元組 ...

MySQL 資料型別 資料型別的屬性

資料表在建立時,需為每個字段選擇資料型別,而資料型別的選擇則決定著資料的儲存格式,有效範圍和相應的限制。mysql 提供了多種資料型別,主要分為 3 類 1 整型 mysql資料型別 含義 有符號 tinyint m 1個位元組 範圍 128 127 smallint m 2個位元組 範圍 3276...