亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

C標準庫源碼解剖(11):擴展整數類型stdint.h和inttypes.h

2024-07-10 13:27:19
字體:
來源:轉載
供稿:網友

C語言的基本精神是讓實現選擇標準類型的長度,但是這種指導思想使可移植代碼難以編寫。C99中引入了stdint.h和inttypes.h,對整數類型的定義和格式轉換進行了規范。這種擴展整數類型的定義非常清晰,從類型名字上就可以看出它的長度,這有利于編寫可移植的代碼。stint.h對整數類型進行定義,inttypes.h包含了stdint.h并增加了可移植的格式控制串和轉換函數。
    1、stdint.h: 定義標準的擴展整數類型。包括準確長度類型intN_t、最小長度類型int_leastN_t、快速長度類型int_fastN_t、指針長度類型intptr_t、最大長度類型intmax_t(N為類型寬度)。
    定義規則:
    1)類型的長度用寬度N參數化,如intN_t,N常常有8,16,32,64。
    2)若要定義某種類型,則該類型的帶符號和無符號類型、類型長度都要定義。如定義int32_t,則有uint32_t類型。
    3)要用...MIN和...MAX宏定義類型的范圍。如INT32_MIN,INT32_MAX,UINT32_MAX。
    4)在inttypes.h要用PRIcKN和SCNcKN定義打印該類型的printf和scanf格式控制字符串。c表示轉換操作符,有d,i,o,u,x或X;K表示種類,為空或者LEAST,FAST,PTR,MAX;N是該類型的寬度。

 

[cpp] view plaincopy
  1. /* ISO C99: 7.18 整數類型 <stdint.h>  */  
  2. #ifndef _STDINT_H  
  3. #define _STDINT_H   1  
  4. #include <features.h>  
  5. #include <bits/wchar.h>  
  6. #include <bits/wordsize.h>  
  7. /* 準確類型:指定長度的準確類型  */  
  8. /* 有符號  */  
  9. /* 有一些與<sys/types.h>中眾所周知的inet代碼重疊 */  
  10. #ifndef __int8_t_defined  
  11. # define __int8_t_defined  
  12. typedef signed char     int8_t; /* 8位的準確長度類型int8_t=signed char */  
  13. typedef short int       int16_t; /* 16位的準確長度類型 */  
  14. typedef int         int32_t;  
  15. # if __WORDSIZE == 64   
  16. typedef long int        int64_t;  /*  64位平臺上64位的準確類型為long */  
  17. # else  
  18. __extension__  
  19. typedef long long int       int64_t; /*  32位平臺上64位的準確類型為long long */  
  20. # endif  
  21. #endif  
  22. /* 無符號  */  
  23. typedef unsigned char       uint8_t;  
  24. typedef unsigned short int  uint16_t;  
  25. #ifndef __uint32_t_defined  
  26. typedef unsigned int        uint32_t;  
  27. # define __uint32_t_defined  
  28. #endif  
  29. #if __WORDSIZE == 64  
  30. typedef unsigned long int   uint64_t;  
  31. #else  
  32. __extension__  
  33. typedef unsigned long long int  uint64_t;  
  34. #endif  
  35.   
  36. /* 最小類型:指定長度的最小類型  */  
  37. /* 有符號  */  
  38. typedef signed char     int_least8_t;  
  39. typedef short int       int_least16_t;  
  40. typedef int         int_least32_t;  
  41. #if __WORDSIZE == 64  
  42. typedef long int        int_least64_t;  
  43. #else  
  44. __extension__  
  45. typedef long long int       int_least64_t;  
  46. #endif  
  47. /* 無符號  */  
  48. typedef unsigned char       uint_least8_t;  
  49. typedef unsigned short int  uint_least16_t;  
  50. typedef unsigned int        uint_least32_t;  
  51. #if __WORDSIZE == 64  
  52. typedef unsigned long int   uint_least64_t;  
  53. #else  
  54. __extension__  
  55. typedef unsigned long long int  uint_least64_t;  
  56. #endif  
  57.   
  58. /* 快速類型:指定長度的最快類型  */  
  59. /* 有符號  */  
  60. typedef signed char     int_fast8_t;  
  61. #if __WORDSIZE == 64       /* 64位平臺 */  
  62. typedef long int        int_fast16_t;  
  63. typedef long int        int_fast32_t;  
  64. typedef long int        int_fast64_t;  
  65. #else     /* 32位平臺 */  
  66. typedef int         int_fast16_t; /* 16位和32位的最快類型均為int */  
  67. typedef int         int_fast32_t;  
  68. __extension__  
  69. typedef long long int       int_fast64_t;  
  70. #endif  
  71. /* 無符號  */  
  72. typedef unsigned char       uint_fast8_t;  
  73. #if __WORDSIZE == 64  
  74. typedef unsigned long int   uint_fast16_t;  
  75. typedef unsigned long int   uint_fast32_t;  
  76. typedef unsigned long int   uint_fast64_t;  
  77. #else  
  78. typedef unsigned int        uint_fast16_t;  
  79. typedef unsigned int        uint_fast32_t;  
  80. __extension__  
  81. typedef unsigned long long int  uint_fast64_t;  
  82. #endif  
  83.   
  84. /* 通用指針類型:即void * 型指針的類型,64位平臺上為long,32位平臺上為int  */  
  85. #if __WORDSIZE == 64  
  86. # ifndef __intptr_t_defined  
  87. typedef long int        intptr_t;  
  88. #  define __intptr_t_defined  
  89. # endif  
  90. typedef unsigned long int   uintptr_t;  
  91. #else  
  92. # ifndef __intptr_t_defined  
  93. typedef int         intptr_t;  
  94. #  define __intptr_t_defined  
  95. # endif  
  96. typedef unsigned int        uintptr_t;  
  97. #endif  
  98.   
  99. /* 最大類型:指定長度的最大整數類型  */  
  100. #if __WORDSIZE == 64  
  101. typedef long int        intmax_t;  /* 64位平臺上的最大整數類型為long */  
  102. typedef unsigned long int   uintmax_t;  
  103. #else  
  104. __extension__  
  105. typedef long long int       intmax_t;  /* 32位平臺上的最大整數類型為long long */  
  106. __extension__  
  107. typedef unsigned long long int  uintmax_t;  
  108. #endif  
  109. /* ISO C99標準指出,在C++實現中這些宏應該只在被請求到的時候才定義 */  
  110. #if !defined __cplusplus || defined __STDC_LIMIT_MACROS  
  111. # if __WORDSIZE == 64  
  112. #  define __INT64_C(c)  c ## L  
  113. #  define __UINT64_C(c) c ## UL  
  114. # else  
  115. #  define __INT64_C(c)  c ## LL  
  116. #  define __UINT64_C(c) c ## ULL  
  117. # endif  
  118. /* 整數類型的范圍  */  
  119. /* 有符號整數類型的最小值:-2**(N-1),其中最小負數-2**(N-1)=100...0沒有對應正數,其反數還是自己  */  
  120. # define INT8_MIN       (-128)  
  121. # define INT16_MIN      (-32767-1)  
  122. # define INT32_MIN      (-2147483647-1)  
  123. # define INT64_MIN      (-__INT64_C(9223372036854775807)-1)  
  124. /* 有符號整數類型的最大值:2**(N-1)-1  */  
  125. # define INT8_MAX       (127)  
  126. # define INT16_MAX      (32767)  
  127. # define INT32_MAX      (2147483647)  
  128. # define INT64_MAX      (__INT64_C(9223372036854775807))  
  129. /* 無符號整數類型的最大值:2**(N-1)-1,注意有Min=-MAX-1  */  
  130. # define UINT8_MAX      (255)  
  131. # define UINT16_MAX     (65535)  
  132. # define UINT32_MAX     (4294967295U)  
  133. # define UINT64_MAX     (__UINT64_C(18446744073709551615))  
  134.   
  135. /* 有符號最小類型的最小值  */  
  136. # define INT_LEAST8_MIN     (-128)  
  137. # define INT_LEAST16_MIN    (-32767-1)  
  138. # define INT_LEAST32_MIN    (-2147483647-1)  
  139. # define INT_LEAST64_MIN    (-__INT64_C(9223372036854775807)-1)  
  140. /* 有符號最小類型的最大值  */  
  141. # define INT_LEAST8_MAX     (127)  
  142. # define INT_LEAST16_MAX    (32767)  
  143. # define INT_LEAST32_MAX    (2147483647)  
  144. # define INT_LEAST64_MAX    (__INT64_C(9223372036854775807))  
  145. /* 無符號最小類型的最大值  */  
  146. # define UINT_LEAST8_MAX    (255)  
  147. # define UINT_LEAST16_MAX   (65535)  
  148. # define UINT_LEAST32_MAX   (4294967295U)  
  149. # define UINT_LEAST64_MAX   (__UINT64_C(18446744073709551615))  
  150.   
  151. /* 有符號快速類型的最小值  */  
  152. # define INT_FAST8_MIN      (-128)  
  153. # if __WORDSIZE == 64  
  154. #  define INT_FAST16_MIN    (-9223372036854775807L-1)  
  155. #  define INT_FAST32_MIN    (-9223372036854775807L-1)  
  156. # else  
  157. #  define INT_FAST16_MIN    (-2147483647-1)  
  158. #  define INT_FAST32_MIN    (-2147483647-1)  
  159. # endif  
  160. # define INT_FAST64_MIN     (-__INT64_C(9223372036854775807)-1)  
  161. /* 有符號快速類型的最大值  */  
  162. # define INT_FAST8_MAX      (127)  
  163. # if __WORDSIZE == 64  
  164. #  define INT_FAST16_MAX    (9223372036854775807L)  
  165. #  define INT_FAST32_MAX    (9223372036854775807L)  
  166. # else  
  167. #  define INT_FAST16_MAX    (2147483647)  
  168. #  define INT_FAST32_MAX    (2147483647)  
  169. # endif  
  170. # define INT_FAST64_MAX     (__INT64_C(9223372036854775807))  
  171. /* 無符號快速類型的最大值  */  
  172. # define UINT_FAST8_MAX     (255)  
  173. # if __WORDSIZE == 64  
  174. #  define UINT_FAST16_MAX   (18446744073709551615UL)  
  175. #  define UINT_FAST32_MAX   (18446744073709551615UL)  
  176. # else  
  177. #  define UINT_FAST16_MAX   (4294967295U)  
  178. #  define UINT_FAST32_MAX   (4294967295U)  
  179. # endif  
  180. # define UINT_FAST64_MAX    (__UINT64_C(18446744073709551615))  
  181.   
  182. /* 指針類型(持有void*型指針)的范圍  */  
  183. # if __WORDSIZE == 64  
  184. #  define INTPTR_MIN        (-9223372036854775807L-1)  
  185. #  define INTPTR_MAX        (9223372036854775807L)  
  186. #  define UINTPTR_MAX       (18446744073709551615UL)  
  187. # else  
  188. #  define INTPTR_MIN        (-2147483647-1)  
  189. #  define INTPTR_MAX        (2147483647)  
  190. #  define UINTPTR_MAX       (4294967295U)  
  191. # endif  
  192.   
  193. /* 有符號最大類型的最小值  */  
  194. # define INTMAX_MIN     (-__INT64_C(9223372036854775807)-1)  
  195. /* 符號最大類型的最大值  */  
  196. # define INTMAX_MAX     (__INT64_C(9223372036854775807))  
  197. /* 無符號最大類型的最大值 */  
  198. # define UINTMAX_MAX        (__UINT64_C(18446744073709551615))  
  199.   
  200. /* 其他整數類型的范圍  */  
  201. /* ptrdiff_t類型的范圍  */  
  202. # if __WORDSIZE == 64  
  203. #  define PTRDIFF_MIN       (-9223372036854775807L-1)  
  204. #  define PTRDIFF_MAX       (9223372036854775807L)  
  205. # else  
  206. #  define PTRDIFF_MIN       (-2147483647-1)  
  207. #  define PTRDIFF_MAX       (2147483647)  
  208. # endif  
  209. /* sig_atomic_t類型的范圍  */  
  210. # define SIG_ATOMIC_MIN     (-2147483647-1)  
  211. # define SIG_ATOMIC_MAX     (2147483647)  
  212. /* size_t類型的范圍  */  
  213. # if __WORDSIZE == 64  
  214. #  define SIZE_MAX      (18446744073709551615UL)  
  215. # else  
  216. #  define SIZE_MAX      (4294967295U)  
  217. # endif  
  218. /* wchar_t類型的范圍  */  
  219. # ifndef WCHAR_MIN  
  220. /* 這些常量可能在<wchar.h>也定義了  */  
  221. #  define WCHAR_MIN     __WCHAR_MIN  
  222. #  define WCHAR_MAX     __WCHAR_MAX  
  223. # endif  
  224. /* wint_t類型的范圍  */  
  225. # define WINT_MIN       (0u)  
  226. # define WINT_MAX       (4294967295u)  
  227. #endif  /* C++ && limit macros */  
  228. /* ISO C99標準指出,在C++實現中這些宏應該只在被請求到的時候才定義 */  
  229. #if !defined __cplusplus || defined __STDC_CONSTANT_MACROS  
  230. /* 有符號  */  
  231. # define INT8_C(c)  c  
  232. # define INT16_C(c) c  
  233. # define INT32_C(c) c  
  234. # if __WORDSIZE == 64  
  235. #  define INT64_C(c)    c ## L  
  236. # else  
  237. #  define INT64_C(c)    c ## LL  
  238. # endif  
  239. /* 無符號  */  
  240. # define UINT8_C(c) c  
  241. # define UINT16_C(c)    c  
  242. # define UINT32_C(c)    c ## U  
  243. # if __WORDSIZE == 64  
  244. #  define UINT64_C(c)   c ## UL  
  245. # else  
  246. #  define UINT64_C(c)   c ## ULL  
  247. # endif  
  248. /* 最大類型  */  
  249. # if __WORDSIZE == 64  
  250. #  define INTMAX_C(c)   c ## L  
  251. #  define UINTMAX_C(c)  c ## UL  
  252. # else  
  253. #  define INTMAX_C(c)   c ## LL  
  254. #  define UINTMAX_C(c)  c ## ULL  
  255. # endif  
  256. #endif  /* C++ && constant macros */  
  257. #endif /* stdint.h */  

 

    解釋:
    (1)準確長度類型:具有準確長度,沒有填充位,在stdint.h是可選的。類型intN_t, uintN_t,范圍INTN_MIN, INTN_MAX, UINTN_MAX,inttypes.h中的控制字符串PRIcN, SCNcN。
    最小長度類型:具有指定長度的最小類型,至少要對N=8,16,32,64定義這些類型。宏INTN_C(constant), UINTN_C(constant)用于把傳進來的常數擴展成相應類型的常量(即在后面加常量修飾符,如U,L,LL,ULL)。
    快速長度類型:具有指定最小長度的最快類型。至少要對N=8,16,32,64定義這些類型。
    指針長度類型:intptr_t, uintptr_t,分別是帶符號和無符號整數類型,可以放置任何對象指針。范圍INTPTR_MIN, INTPTR_MAX, UINTPTR_MAX。
    最大長度類型:intmax_t, uintmax_t,最大帶符號和無符號整數類型,所有C語言實現都要定義。宏INTMAX_C(), UINTMAX_C()用于把傳進來的常數擴展成相應類型的常量。
    (2)GNU實現中,各種擴展整數類型與我們通常使用的整數類型長度一致,即8位使用char類型,16位使用sort類型,32位使用int類型,64位在64位平臺使用long類型,在32位平臺上使用long long類型,注意32平臺上的long一般和int一樣大。只有快速類型有點區別,在32位平臺上,16位和32位快速類型均使用int(這樣才能快速地按字尋址),64位快速類型使用long long;在64位平臺上,16位、32位和64位快速類型均使用long。最大類型與字長度一致,指針類型也與字長度一致。
    (3)有符號整數范圍為-2**(N-1)~2**(N-1)-1,其中最小負數-2**(N-1)=100...0沒有對應正數,其反數還是自己。無符號整數類型范圍為0~2**N-1。
    (4)ptrdiff_t,size_t,wchar_t,wint_t與sig_atomic_t類型的范圍也在stdint.h中定義,有PTRDIFF_MIN/PTRDIFF_MAX, SIZE_MAX,  WCHAR_MIN/WCHAR_MAX, WINT_MIN/WINT_MAX, SIG_ATOMIC_MIN/SIG_ATOMIC_MAX。在32位平臺的GNU實現中,ptrdiff_t一般為int類型(在64位平臺上則為long類型),size_t為unsigned int類型(在64位平臺上則為unsigned long類型),wchar_t一般為int類型,wint_t一般為unsigned int類型,sig_atomic_t通常為int類型。
    2、inttypes.h: 定義擴展整數類型的printf和scanf格式控制字符串,用于實現可移植的格式化輸出或輸入。還定義了一些與stdlib.h中對應的基本算術函數和轉換函數。imaxabs和imaxdiv函數類似于stdlib.h中的abs和div函數,imaxabs(x)返回最大類型整數x的絕對值,imaxdiv(n,d)計算最大類型整數的除法n/d,得出的商和余數分別放在imaxdiv_t結構的quot和rem成員中。strtoimax和strtoumax函數將字符串轉換成最大類型的整數,與stdlib.h中的strtol和strtoul類似。wcstoimax和wcstoumax函數將寬字符串轉換成最大類型的整數,與wchar.h中的wcstol和wcstoul類似。

 

[cpp] view plaincopy
  1. /* ISO C99: 7.8  整數類型的格式轉換   <inttypes.h>  */  
  2. #ifndef _INTTYPES_H  
  3. #define _INTTYPES_H 1  
  4. #include <features.h>  
  5. /* 獲取類型定義  */  
  6. #include <stdint.h>  
  7. /* 獲取wchar_t的定義,但我們自己不能定義  */  
  8. #ifndef ____gwchar_t_defined  
  9. # ifdef __cplusplus  
  10. #  define __gwchar_t wchar_t  
  11. # elif defined __WCHAR_TYPE__  
  12. typedef __WCHAR_TYPE__ __gwchar_t;  
  13. # else  
  14. #  define __need_wchar_t  
  15. #  include <stddef.h>  
  16. typedef wchar_t __gwchar_t;  
  17. # endif  
  18. # define ____gwchar_t_defined   1  
  19. #endif  
  20. /* ISO C99標準指出,這些宏應該只在被請求到的時候才定義 */  
  21. #if !defined __cplusplus || defined __STDC_FORMAT_MACROS  
  22. # if __WORDSIZE == 64  
  23. #  define __PRI64_PREFIX    "l"  
  24. #  define __PRIPTR_PREFIX   "l"  
  25. # else  
  26. #  define __PRI64_PREFIX    "ll"  
  27. #  define __PRIPTR_PREFIX  
  28. # endif  
  29. /* 表示輸出格式控制串的宏  */  
  30. /* 十進制格式  */  
  31. # define PRId8      "d"  /* 表示8位準確類型的輸出格式控制串 */  
  32. # define PRId16     "d"  
  33. # define PRId32     "d"  
  34. # define PRId64     __PRI64_PREFIX "d"  
  35. # define PRIdLEAST8 "d"    /* 表示8位最小類型的輸出格式控制串 */  
  36. # define PRIdLEAST16    "d"  
  37. # define PRIdLEAST32    "d"  
  38. # define PRIdLEAST64    __PRI64_PREFIX "d"  
  39. # define PRIdFAST8  "d"  
  40. # define PRIdFAST16 __PRIPTR_PREFIX "d"  
  41. # define PRIdFAST32 __PRIPTR_PREFIX "d"  
  42. # define PRIdFAST64 __PRI64_PREFIX "d"  
  43. # define PRIi8      "i"  
  44. # define PRIi16     "i"  
  45. # define PRIi32     "i"  
  46. # define PRIi64     __PRI64_PREFIX "i"  
  47. # define PRIiLEAST8 "i"  
  48. # define PRIiLEAST16    "i"  
  49. # define PRIiLEAST32    "i"  
  50. # define PRIiLEAST64    __PRI64_PREFIX "i"  
  51. # define PRIiFAST8  "i"  
  52. # define PRIiFAST16 __PRIPTR_PREFIX "i"  
  53. # define PRIiFAST32 __PRIPTR_PREFIX "i"  
  54. # define PRIiFAST64 __PRI64_PREFIX "i"  
  55. /* 八進制格式  */  
  56. # define PRIo8      "o"  
  57. # define PRIo16     "o"  
  58. # define PRIo32     "o"  
  59. # define PRIo64     __PRI64_PREFIX "o"  
  60. # define PRIoLEAST8 "o"  
  61. # define PRIoLEAST16    "o"  
  62. # define PRIoLEAST32    "o"  
  63. # define PRIoLEAST64    __PRI64_PREFIX "o"  
  64. # define PRIoFAST8  "o"  
  65. # define PRIoFAST16 __PRIPTR_PREFIX "o"  
  66. # define PRIoFAST32 __PRIPTR_PREFIX "o"  
  67. # define PRIoFAST64 __PRI64_PREFIX "o"  
  68. /* 無符號整數格式  */  
  69. # define PRIu8      "u"  
  70. # define PRIu16     "u"  
  71. # define PRIu32     "u"  
  72. # define PRIu64     __PRI64_PREFIX "u"  
  73. # define PRIuLEAST8 "u"  
  74. # define PRIuLEAST16    "u"  
  75. # define PRIuLEAST32    "u"  
  76. # define PRIuLEAST64    __PRI64_PREFIX "u"  
  77. # define PRIuFAST8  "u"  
  78. # define PRIuFAST16 __PRIPTR_PREFIX "u"  
  79. # define PRIuFAST32 __PRIPTR_PREFIX "u"  
  80. # define PRIuFAST64 __PRI64_PREFIX "u"  
  81. /* 小寫十六進制格式  */  
  82. # define PRIx8      "x"  
  83. # define PRIx16     "x"  
  84. # define PRIx32     "x"  
  85. # define PRIx64     __PRI64_PREFIX "x"  
  86. # define PRIxLEAST8 "x"  
  87. # define PRIxLEAST16    "x"  
  88. # define PRIxLEAST32    "x"  
  89. # define PRIxLEAST64    __PRI64_PREFIX "x"  
  90. # define PRIxFAST8  "x"  
  91. # define PRIxFAST16 __PRIPTR_PREFIX "x"  
  92. # define PRIxFAST32 __PRIPTR_PREFIX "x"  
  93. # define PRIxFAST64 __PRI64_PREFIX "x"  
  94. /* 大寫十六進制格式  */  
  95. # define PRIX8      "X"  
  96. # define PRIX16     "X"  
  97. # define PRIX32     "X"  
  98. # define PRIX64     __PRI64_PREFIX "X"  
  99. # define PRIXLEAST8 "X"  
  100. # define PRIXLEAST16    "X"  
  101. # define PRIXLEAST32    "X"  
  102. # define PRIXLEAST64    __PRI64_PREFIX "X"  
  103. # define PRIXFAST8  "X"  
  104. # define PRIXFAST16 __PRIPTR_PREFIX "X"  
  105. # define PRIXFAST32 __PRIPTR_PREFIX "X"  
  106. # define PRIXFAST64 __PRI64_PREFIX "X"  
  107. /* 打印intmax_t和uintmax_t的格式宏  */  
  108. # define PRIdMAX    __PRI64_PREFIX "d"  
  109. # define PRIiMAX    __PRI64_PREFIX "i"  
  110. # define PRIoMAX    __PRI64_PREFIX "o"  
  111. # define PRIuMAX    __PRI64_PREFIX "u"  
  112. # define PRIxMAX    __PRI64_PREFIX "x"  
  113. # define PRIXMAX    __PRI64_PREFIX "X"  
  114.   
  115. /* 打印intptr_t和uintptr_t的格式宏  */  
  116. # define PRIdPTR    __PRIPTR_PREFIX "d"  
  117. # define PRIiPTR    __PRIPTR_PREFIX "i"  
  118. # define PRIoPTR    __PRIPTR_PREFIX "o"  
  119. # define PRIuPTR    __PRIPTR_PREFIX "u"  
  120. # define PRIxPTR    __PRIPTR_PREFIX "x"  
  121. # define PRIXPTR    __PRIPTR_PREFIX "X"  
  122. /* 表示輸入格式控制串的宏  */  
  123. /* 有符號十進格式  */  
  124. # define SCNd8      "hhd"  
  125. # define SCNd16     "hd"  
  126. # define SCNd32     "d"  
  127. # define SCNd64     __PRI64_PREFIX "d"  
  128. # define SCNdLEAST8 "hhd"  
  129. # define SCNdLEAST16    "hd"  
  130. # define SCNdLEAST32    "d"  
  131. # define SCNdLEAST64    __PRI64_PREFIX "d"  
  132. # define SCNdFAST8  "hhd"  
  133. # define SCNdFAST16 __PRIPTR_PREFIX "d"  
  134. # define SCNdFAST32 __PRIPTR_PREFIX "d"  
  135. # define SCNdFAST64 __PRI64_PREFIX "d"  
  136. /* 有符號十進制格式  */  
  137. # define SCNi8      "hhi"  
  138. # define SCNi16     "hi"  
  139. # define SCNi32     "i"  
  140. # define SCNi64     __PRI64_PREFIX "i"  
  141. # define SCNiLEAST8 "hhi"  
  142. # define SCNiLEAST16    "hi"  
  143. # define SCNiLEAST32    "i"  
  144. # define SCNiLEAST64    __PRI64_PREFIX "i"  
  145. # define SCNiFAST8  "hhi"  
  146. # define SCNiFAST16 __PRIPTR_PREFIX "i"  
  147. # define SCNiFAST32 __PRIPTR_PREFIX "i"  
  148. # define SCNiFAST64 __PRI64_PREFIX "i"  
  149. /* 無符號十進制格式  */  
  150. # define SCNu8      "hhu"  
  151. # define SCNu16     "hu"  
  152. # define SCNu32     "u"  
  153. # define SCNu64     __PRI64_PREFIX "u"  
  154. # define SCNuLEAST8 "hhu"  
  155. # define SCNuLEAST16    "hu"  
  156. # define SCNuLEAST32    "u"  
  157. # define SCNuLEAST64    __PRI64_PREFIX "u"  
  158. # define SCNuFAST8  "hhu"  
  159. # define SCNuFAST16 __PRIPTR_PREFIX "u"  
  160. # define SCNuFAST32 __PRIPTR_PREFIX "u"  
  161. # define SCNuFAST64 __PRI64_PREFIX "u"  
  162. /* 八進制格式  */  
  163. # define SCNo8      "hho"  
  164. # define SCNo16     "ho"  
  165. # define SCNo32     "o"  
  166. # define SCNo64     __PRI64_PREFIX "o"  
  167. # define SCNoLEAST8 "hho"  
  168. # define SCNoLEAST16    "ho"  
  169. # define SCNoLEAST32    "o"  
  170. # define SCNoLEAST64    __PRI64_PREFIX "o"  
  171. # define SCNoFAST8  "hho"  
  172. # define SCNoFAST16 __PRIPTR_PREFIX "o"  
  173. # define SCNoFAST32 __PRIPTR_PREFIX "o"  
  174. # define SCNoFAST64 __PRI64_PREFIX "o"  
  175. /* 十六進制格式  */  
  176. # define SCNx8      "hhx"  
  177. # define SCNx16     "hx"  
  178. # define SCNx32     "x"  
  179. # define SCNx64     __PRI64_PREFIX "x"  
  180. # define SCNxLEAST8 "hhx"  
  181. # define SCNxLEAST16    "hx"  
  182. # define SCNxLEAST32    "x"  
  183. # define SCNxLEAST64    __PRI64_PREFIX "x"  
  184. # define SCNxFAST8  "hhx"  
  185. # define SCNxFAST16 __PRIPTR_PREFIX "x"  
  186. # define SCNxFAST32 __PRIPTR_PREFIX "x"  
  187. # define SCNxFAST64 __PRI64_PREFIX "x"  
  188.   
  189. /* 輸入intmax_t和uintmax_t的格式宏  */  
  190. # define SCNdMAX    __PRI64_PREFIX "d"  
  191. # define SCNiMAX    __PRI64_PREFIX "i"  
  192. # define SCNoMAX    __PRI64_PREFIX "o"  
  193. # define SCNuMAX    __PRI64_PREFIX "u"  
  194. # define SCNxMAX    __PRI64_PREFIX "x"  
  195. /* 輸入intptr_t和uintptr_t的格式宏  */  
  196. # define SCNdPTR    __PRIPTR_PREFIX "d"  
  197. # define SCNiPTR    __PRIPTR_PREFIX "i"  
  198. # define SCNoPTR    __PRIPTR_PREFIX "o"  
  199. # define SCNuPTR    __PRIPTR_PREFIX "u"  
  200. # define SCNxPTR    __PRIPTR_PREFIX "x"  
  201. #endif  /* C++ && format macros */  
  202.   
  203. __BEGIN_DECLS  
  204. #if __WORDSIZE == 64  
  205. /* 64位平臺 */  
  206. /* 我們要使用ldiv_t來定義uintmax_t  */  
  207. typedef struct  
  208.   {  
  209.     long int quot;      /* 商  */  
  210.     long int rem;       /* 余數  */  
  211.   } imaxdiv_t;  
  212. #else   /*  32位平臺 */  
  213. /* 我們要使用lldiv_t來定義uintmax_t  */  
  214. typedef struct  
  215.   {  
  216.     long long int quot;     /* 商  */  
  217.     long long int rem;      /* 余數  */  
  218.   } imaxdiv_t;  
  219. #endif  
  220. /* 計算N的絕對值  */  
  221. extern intmax_t imaxabs (intmax_t __n) __THROW __attribute__ ((__const__));  
  222. /* 返回NUMER除以DENOM的商和余數,放在imaxdiv_t結構中 */  
  223. extern imaxdiv_t imaxdiv (intmax_t __numer, intmax_t __denom)  
  224.       __THROW __attribute__ ((__const__));  
  225. /* 與strtol類似,但轉換成intmax_t  */  
  226. extern intmax_t strtoimax (__const char *__restrict __nptr,  
  227.                char **__restrict __endptr, int __base) __THROW;  
  228. /* 與strtoul類似,但轉換成uintmax_t  */  
  229. extern uintmax_t strtoumax (__const char *__restrict __nptr,  
  230.                 char ** __restrict __endptr, int __base) __THROW;  
  231. /* 與wcstol類似,但轉換成intmax_t  */  
  232. extern intmax_t wcstoimax (__const __gwchar_t *__restrict __nptr,  
  233.                __gwchar_t **__restrict __endptr, int __base)  
  234.      __THROW;  
  235. /* 與wcstoul類似,但轉換成uintmax_t  */  
  236. extern uintmax_t wcstoumax (__const __gwchar_t *__restrict __nptr,  
  237.                 __gwchar_t ** __restrict __endptr, int __base)  
  238.      __THROW;  
  239.        
  240. /* 下面是GNU的擴展:是上面4個標準轉換函數的外部內聯版本,有64位平臺和32位平臺之分 */  
  241. __END_DECLS  
  242. #endif /* inttypes.h */  

 

    注意對于inttypes.h和stdlib.h中的絕對值函數和除法運算函數,很容易實現,編譯器通常把它們當作內部函數(標準C中允許這樣做),因此在glibc中并沒有這些函數的源代碼。
    3、strtoimax和strtoumax函數: 將字符串轉換成intmax_t類型的整數,一個為有符號,一個為無符號。其實現都是調用內部函數來完成的。

 

[cpp] view plaincopy
  1. /* strtoimax.c:將字符串轉換成最大整數類型  */  
  2. #include <inttypes.h>  
  3. #include <stdlib.h>  
  4. intmax_t  
  5. strtoimax (const char *__restrict nptr, char **__restrict endptr, int base)  
  6. {  
  7.   return __strtoll_internal (nptr, endptr, base, 0);  
  8. }  

 

 

[cpp] view plaincopy
  1. /* strtoumax.c:將字符串轉換成無符號的最大整數類型  */  
  2. #include <inttypes.h>  
  3. #include <stdlib.h>  
  4. uintmax_t  
  5. strtoumax (const char *__restrict nptr, char **__restrict endptr, int base)  
  6. {  
  7.   return __strtoull_internal (nptr, endptr, base, 0);  
  8. }  

 

    4、wcstoimax和wcstoumax函數: 將寬字符串轉換成intmax_t類型的整數,一個為有符號,一個為無符號。其實現也都是調用內部函數來完成的。

 

[cpp] view plaincopy
  1. /* wcstoimax.c:將寬字符串轉換成最大整數類型  */  
  2. #include <inttypes.h>  
  3. #include <wchar.h>  
  4. intmax_t  
  5. wcstoimax (const wchar_t *__restrict nptr, wchar_t **__restrict endptr,  
  6.        int base)  
  7. {  
  8.   return __wcstoll_internal (nptr, endptr, base, 0);  
  9. }  

 

 

[cpp] view plaincopy
  1. /* wcstoumax.c:將寬字符串轉換成無符號的最大整數類型  */  
  2. #include <inttypes.h>  
  3. #include <wchar.h>  
  4. uintmax_t  
  5. wcstoumax (const wchar_t *__restrict nptr, wchar_t **__restrict endptr,  
  6.        int base)  
  7. {  
  8.   return __wcstoull_internal (nptr, endptr, base, 0);  
  9. }

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人激情电影一区二区| 日韩中文字幕精品视频| 精品女厕一区二区三区| 国产精品久久久久久久午夜| 欧美日韩免费在线观看| 综合欧美国产视频二区| 亚洲第一精品电影| 久久精视频免费在线久久完整在线看| 欧美日韩国产色| 欧美性视频网站| 亚洲最大av在线| 欧美日本亚洲视频| 俺去亚洲欧洲欧美日韩| 一本一道久久a久久精品逆3p| 97精品视频在线观看| 久久精品国产一区二区电影| 欧美激情高清视频| 国产精品久久久久久久久借妻| 综合136福利视频在线| 美日韩精品免费视频| 欧美精品videossex性护士| 中文字幕精品www乱入免费视频| 亚洲欧美制服综合另类| 亚洲天堂网在线观看| 久久免费少妇高潮久久精品99| 日韩欧美高清视频| 欧美日产国产成人免费图片| 精品久久香蕉国产线看观看gif| 精品性高朝久久久久久久| 国产精品一区二区久久| 福利二区91精品bt7086| 欧美大片在线免费观看| 亚洲的天堂在线中文字幕| 国产在线观看精品| 欧美第一淫aaasss性| 久久中文字幕在线| 欧美大尺度激情区在线播放| 欧美韩日一区二区| 亚洲欧美日韩天堂| 国产精品黄页免费高清在线观看| 久久香蕉国产线看观看av| 久久亚洲精品毛片| 国产成人一区二区三区小说| 国内精品模特av私拍在线观看| 色噜噜久久综合伊人一本| 日韩精品视频在线免费观看| 精品久久久一区二区| 亚洲福利在线观看| 国产精品久久久久aaaa九色| 5566成人精品视频免费| 96精品视频在线| 久久影视三级福利片| 亚洲激情在线观看视频免费| 国产欧美精品久久久| 中文字幕综合在线| 国产一区二区激情| 亚洲精品欧美日韩专区| 日韩专区在线播放| 川上优av一区二区线观看| 日韩av在线最新| 亚洲美女福利视频网站| 中文字幕亚洲欧美在线| 精品国产一区二区三区久久狼5月| 国产精品视频xxxx| 奇米四色中文综合久久| 91精品综合视频| 久久视频在线观看免费| 久久免费观看视频| 中文字幕日韩欧美精品在线观看| 91麻豆国产语对白在线观看| 国自在线精品视频| 亚洲精品自在久久| 97久久精品在线| 欧美激情亚洲视频| 5278欧美一区二区三区| 视频一区视频二区国产精品| 国产精品美女午夜av| 日韩欧美精品网站| 国产日产欧美精品| 成人羞羞国产免费| 欧美性色xo影院| 久久99久国产精品黄毛片入口| 尤物99国产成人精品视频| 国产亚洲精品久久久| 亚洲成人xxx| 午夜精品蜜臀一区二区三区免费| 亚洲无亚洲人成网站77777| 国产乱人伦真实精品视频| 亚洲欧美日韩高清| 俺也去精品视频在线观看| 欧美—级高清免费播放| 欧美亚洲一区在线| 亚洲а∨天堂久久精品9966| 日韩精品免费电影| 91中文在线观看| 久久久999精品免费| 成人xvideos免费视频| 精品亚洲精品福利线在观看| 亚洲第一页在线| 日韩亚洲欧美中文在线| 国产精品青草久久久久福利99| 日韩电影在线观看中文字幕| 国产97色在线|日韩| 91av成人在线| 国产精品三级美女白浆呻吟| 55夜色66夜色国产精品视频| 欧美精品18videos性欧美| 久久精品国产亚洲一区二区| 日韩一中文字幕| 8x拔播拔播x8国产精品| 欧美国产激情18| 欧美性猛交xxxx黑人猛交| 性欧美激情精品| 亚洲电影免费在线观看| 91精品在线看| 欧美精品福利在线| 欧美在线视频导航| 亚洲精品一区久久久久久| 中文字幕在线亚洲| 久久精品国产2020观看福利| 日韩免费av一区二区| 色老头一区二区三区在线观看| 欧美在线视频在线播放完整版免费观看| 国产一区私人高清影院| 日韩有码在线视频| 国产女精品视频网站免费| 欧美成人免费大片| 最新日韩中文字幕| 成人免费xxxxx在线观看| 日韩av一区二区在线观看| 久久久亚洲福利精品午夜| 亚洲电影在线观看| 欧美中文字幕精品| 狠狠操狠狠色综合网| 国产999精品视频| 国产精品亚洲综合天堂夜夜| 欧美日韩中文字幕在线| 日韩综合中文字幕| 北条麻妃久久精品| 91极品视频在线| 精品毛片三在线观看| 亚洲资源在线看| 日韩av在线网| 伊人久久大香线蕉av一区二区| 欧美日韩中文字幕| 久久久久国色av免费观看性色| 一本色道久久综合狠狠躁篇怎么玩| 一本一本久久a久久精品综合小说| 日韩av电影在线播放| 亚洲欧美日韩中文视频| 亚洲人精选亚洲人成在线| 亚洲欧美日韩成人| 国产精品www网站| 在线亚洲男人天堂| 国产视频精品xxxx| 欧美大肥婆大肥bbbbb| 国产99视频精品免视看7| 亚洲免费av电影| 91精品免费久久久久久久久| 亚洲男女自偷自拍图片另类| 中文字幕精品久久久久| 精品中文字幕在线观看| 欧美激情成人在线视频| 九九热最新视频//这里只有精品|