歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言基本數據類型及其擴展和可移植性問題

不同的C標准,基本數據類型大同小異,但基本都會包括以下幾種:

一定含有 char 、short 、int 、long 、float 、double

可能含有long int、long long、long double

甚至還有復數類型float_Complex、double_Complex、long double_Complex

                                      Float_Imaginary、double_Imaginary、longdouble_Imaginary

下面我們介紹最基本的char 、short 、int 、long 、float 、double

其中char、short、int、long都可以用unsigned和signed修飾來表示有符號和無符號,缺省默認是signed

那每種數據類型占用的存儲空間是多少呢?答案是不確定的。不同的系統上面位數都不一樣。

可以采用sizeof(type)來獲得自己機器上各種數據類型位數

例如我的compad320的位數(單位是字節)

#include<stdio.h>
int main(void){
 printf("char length: %d\n",sizeof(char));
 printf("short length: %d\n",sizeof(short));
 printf("int length: %d\n",sizeof(int));
 printf("long length: %d\n",sizeof(long));
 printf("long int length: %d\n",sizeof(long int));
 printf("float length: %d\n",sizeof(float));
 printf("double length: %d\n",sizeof(double));
 return 0;
}

 

char length: 1

short length: 2

int length: 4

long length: 4

long int length: 4

float length: 4

double length: 8

所以不確定就會帶來一些問題,比如你寫的程序裡面的數據長度都要求是固定的,int 32位,long64位,但是移植到不同的機器上後,可能int是16位,long是32位,這就會出問題。

可不可以在聲明類型的時候就指明是多少位呢?比如int32 就作為一種類型,這裡就可以在頭文件中用typedef定義自己的類型,程序都同意使用自己定義的數據類型,從而在移植程序的時候,只用根據不同的系統來修改類型定義頭文件即可。

例如可以在自己的機器上定義出int32

Typedef signed int int32;(因為signed int在本機器上是32位的)

另外需要注意的問題就是如果你自己定義了基本類型,那麼printf和scanf在格式化輸出的時候還需要做相應的處理,因為不同數據類型對應著不同的輸出類型。例如格式化輸出long

就需要%ld。所以你還必須定義自己的格式化輸出符,可以采用串宏的方法

如:typedef short int16;就該對應定義#define PRId16 “hd”

然後int16 me16;printf(“me16=%”PRId16”\n”,me16);該句經過宏替換後就形成printf(“me16=%””hd””\n”,me16);而C語言默認將三個連續的字符串合並成一個引號一起來的字符串,最後就變成printf(“me16=%hd\n”,me16);從而按正確的格式輸出int16類型的數據

 

自己定義的可能比較麻煩,好在C語言還有擴展數據類型,在inttypes.h頭文件中。但這個都需要編譯器的支持,不同的編譯器可能用法不一樣。

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是該類型的寬度。

/* ISO C99: 7.18 整數類型 <stdint.h>  */
#ifndef _STDINT_H
#define _STDINT_H 1
#include <features.h>
#include <bits/wchar.h>
#include <bits/wordsize.h>
/* 准確類型:指定長度的准確類型  */
/* 有符號  */
/* 有一些與<sys/types.h>中眾所周知的inet代碼重疊 */
#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char  int8_t; /* 8位的准確長度類型int8_t=signed char */
typedef short int  int16_t; /* 16位的准確長度類型 */
typedef int   int32_t;
# if __WORDSIZE == 64
typedef long int  int64_t;  /*  64位平台上64位的准確類型為long */
# else
__extension__
typedef long long int  int64_t; /*  32位平台上64位的准確類型為long long */
# endif
#endif
/* 無符號  */
typedef unsigned char  uint8_t;
typedef unsigned short int uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int  uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int uint64_t;
#else
__extension__
typedef unsigned long long int uint64_t;
#endif

/* 最小類型:指定長度的最小類型  */
/* 有符號  */
typedef signed char  int_least8_t;
typedef short int  int_least16_t;
typedef int   int_least32_t;
#if __WORDSIZE == 64
typedef long int  int_least64_t;
#else
__extension__
typedef long long int  int_least64_t;
#endif
/* 無符號  */
typedef unsigned char  uint_least8_t;
typedef unsigned short int uint_least16_t;
typedef unsigned int  uint_least32_t;
#if __WORDSIZE == 64
typedef unsigned long int uint_least64_t;
#else
__extension__
typedef unsigned long long int uint_least64_t;
#endif

/* 快速類型:指定長度的最快類型  */
/* 有符號  */
typedef signed char  int_fast8_t;
#if __WORDSIZE == 64      /* 64位平台 */
typedef long int  int_fast16_t;
typedef long int  int_fast32_t;
typedef long int  int_fast64_t;
#else    /* 32位平台 */
typedef int   int_fast16_t; /* 16位和32位的最快類型均為int */
typedef int   int_fast32_t;
__extension__
typedef long long int  int_fast64_t;
#endif
/* 無符號  */
typedef unsigned char  uint_fast8_t;
#if __WORDSIZE == 64
typedef unsigned long int uint_fast16_t;
typedef unsigned long int uint_fast32_t;
typedef unsigned long int uint_fast64_t;
#else
typedef unsigned int  uint_fast16_t;
typedef unsigned int  uint_fast32_t;
__extension__
typedef unsigned long long int uint_fast64_t;
#endif

/* 通用指針類型:即void * 型指針的類型,64位平台上為long,32位平台上為int  */
#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

/* 最大類型:指定長度的最大整數類型  */
#if __WORDSIZE == 64
typedef long int  intmax_t;  /* 64位平台上的最大整數類型為long */
typedef unsigned long int uintmax_t;
#else
__extension__
typedef long long int  intmax_t;  /* 32位平台上的最大整數類型為long long */
__extension__
typedef unsigned long long int uintmax_t;
#endif
/* ISO C99標准指出,在C++實現中這些宏應該只在被請求到的時候才定義 */
#if !defined __cplusplus || defined __STDC_LIMIT_MACROS
# if __WORDSIZE == 64
#  define __INT64_C(c) c ## L
#  define __UINT64_C(c) c ## UL
# else
#  define __INT64_C(c) c ## LL
#  define __UINT64_C(c) c ## ULL
# endif
/* 整數類型的范圍  */
/* 有符號整數類型的最小值:-2**(N-1),其中最小負數-2**(N-1)=100...0沒有對應正數,其反數還是自己  */
# define INT8_MIN  (-128)
# define INT16_MIN  (-32767-1)
# define INT32_MIN  (-2147483647-1)
# define INT64_MIN  (-__INT64_C(9223372036854775807)-1)
/* 有符號整數類型的最大值:2**(N-1)-1  */
# define INT8_MAX  (127)
# define INT16_MAX  (32767)
# define INT32_MAX  (2147483647)
# define INT64_MAX  (__INT64_C(9223372036854775807))
/* 無符號整數類型的最大值:2**(N-1)-1,注意有Min=-MAX-1  */
# define UINT8_MAX  (255)
# define UINT16_MAX  (65535)
# define UINT32_MAX  (4294967295U)
# define UINT64_MAX  (__UINT64_C(18446744073709551615))

/* 有符號最小類型的最小值  */
# define INT_LEAST8_MIN  (-128)
# define INT_LEAST16_MIN (-32767-1)
# define INT_LEAST32_MIN (-2147483647-1)
# define INT_LEAST64_MIN (-__INT64_C(9223372036854775807)-1)
/* 有符號最小類型的最大值  */
# define INT_LEAST8_MAX  (127)
# define INT_LEAST16_MAX (32767)
# define INT_LEAST32_MAX (2147483647)
# define INT_LEAST64_MAX (__INT64_C(9223372036854775807))
/* 無符號最小類型的最大值  */
# define UINT_LEAST8_MAX (255)
# define UINT_LEAST16_MAX (65535)
# define UINT_LEAST32_MAX (4294967295U)
# define UINT_LEAST64_MAX (__UINT64_C(18446744073709551615))

/* 有符號快速類型的最小值  */
# define INT_FAST8_MIN  (-128)
# if __WORDSIZE == 64
#  define INT_FAST16_MIN (-9223372036854775807L-1)
#  define INT_FAST32_MIN (-9223372036854775807L-1)
# else
#  define INT_FAST16_MIN (-2147483647-1)
#  define INT_FAST32_MIN (-2147483647-1)
# endif
# define INT_FAST64_MIN  (-__INT64_C(9223372036854775807)-1)
/* 有符號快速類型的最大值  */
# define INT_FAST8_MAX  (127)
# if __WORDSIZE == 64
#  define INT_FAST16_MAX (9223372036854775807L)
#  define INT_FAST32_MAX (9223372036854775807L)
# else
#  define INT_FAST16_MAX (2147483647)
#  define INT_FAST32_MAX (2147483647)
# endif
# define INT_FAST64_MAX  (__INT64_C(9223372036854775807))
/* 無符號快速類型的最大值  */
# define UINT_FAST8_MAX  (255)
# if __WORDSIZE == 64
#  define UINT_FAST16_MAX (18446744073709551615UL)
#  define UINT_FAST32_MAX (18446744073709551615UL)
# else
#  define UINT_FAST16_MAX (4294967295U)
#  define UINT_FAST32_MAX (4294967295U)
# endif
# define UINT_FAST64_MAX (__UINT64_C(18446744073709551615))

/* 指針類型(持有void*型指針)的范圍  */
# if __WORDSIZE == 64
#  define INTPTR_MIN  (-9223372036854775807L-1)
#  define INTPTR_MAX  (9223372036854775807L)
#  define UINTPTR_MAX  (18446744073709551615UL)
# else
#  define INTPTR_MIN  (-2147483647-1)
#  define INTPTR_MAX  (2147483647)
#  define UINTPTR_MAX  (4294967295U)
# endif

/* 有符號最大類型的最小值  */
# define INTMAX_MIN  (-__INT64_C(9223372036854775807)-1)
/* 符號最大類型的最大值  */
# define INTMAX_MAX  (__INT64_C(9223372036854775807))
/* 無符號最大類型的最大值 */
# define UINTMAX_MAX  (__UINT64_C(18446744073709551615))

/* 其他整數類型的范圍  */
/* ptrdiff_t類型的范圍  */
# if __WORDSIZE == 64
#  define PTRDIFF_MIN  (-9223372036854775807L-1)
#  define PTRDIFF_MAX  (9223372036854775807L)
# else
#  define PTRDIFF_MIN  (-2147483647-1)
#  define PTRDIFF_MAX  (2147483647)
# endif
/* sig_atomic_t類型的范圍  */
# define SIG_ATOMIC_MIN  (-2147483647-1)
# define SIG_ATOMIC_MAX  (2147483647)
/* size_t類型的范圍  */
# if __WORDSIZE == 64
#  define SIZE_MAX  (18446744073709551615UL)
# else
#  define SIZE_MAX  (4294967295U)
# endif
/* wchar_t類型的范圍  */
# ifndef WCHAR_MIN
/* 這些常量可能在<wchar.h>也定義了  */
#  define WCHAR_MIN  __WCHAR_MIN
#  define WCHAR_MAX  __WCHAR_MAX
# endif
/* wint_t類型的范圍  */
# define WINT_MIN  (0u)
# define WINT_MAX  (4294967295u)
#endif /* C++ && limit macros */
/* ISO C99標准指出,在C++實現中這些宏應該只在被請求到的時候才定義 */
#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS
/* 有符號  */
# define INT8_C(c) c
# define INT16_C(c) c
# define INT32_C(c) c
# if __WORDSIZE == 64
#  define INT64_C(c) c ## L
# else
#  define INT64_C(c) c ## LL
# endif
/* 無符號  */
# define UINT8_C(c) c
# define UINT16_C(c) c
# define UINT32_C(c) c ## U
# if __WORDSIZE == 64
#  define UINT64_C(c) c ## UL
# else
#  define UINT64_C(c) c ## ULL
# endif
/* 最大類型  */
# if __WORDSIZE == 64
#  define INTMAX_C(c) c ## L
#  define UINTMAX_C(c) c ## UL
# else
#  define INTMAX_C(c) c ## LL
#  define UINTMAX_C(c) c ## ULL
# endif
#endif /* C++ && constant macros */
#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為unsignedint類型(在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類似。

/* ISO C99: 7.8  整數類型的格式轉換  <inttypes.h>  */
#ifndef _INTTYPES_H
#define _INTTYPES_H 1
#include <features.h>
/* 獲取類型定義  */
#include <stdint.h>
/* 獲取wchar_t的定義,但我們自己不能定義  */
#ifndef ____gwchar_t_defined
# ifdef __cplusplus
#  define __gwchar_t wchar_t
# elif defined __WCHAR_TYPE__
typedef __WCHAR_TYPE__ __gwchar_t;
# else
#  define __need_wchar_t
#  include <stddef.h>
typedef wchar_t __gwchar_t;
# endif
# define ____gwchar_t_defined 1
#endif
/* ISO C99標准指出,這些宏應該只在被請求到的時候才定義 */
#if !defined __cplusplus || defined __STDC_FORMAT_MACROS
# if __WORDSIZE == 64
#  define __PRI64_PREFIX "l"
#  define __PRIPTR_PREFIX "l"
# else
#  define __PRI64_PREFIX "ll"
#  define __PRIPTR_PREFIX
# endif
/* 表示輸出格式控制串的宏  */
/* 十進制格式  */
# define PRId8  "d"  /* 表示8位准確類型的輸出格式控制串 */
# define PRId16  "d"
# define PRId32  "d"
# define PRId64  __PRI64_PREFIX "d"
# define PRIdLEAST8 "d"    /* 表示8位最小類型的輸出格式控制串 */
# define PRIdLEAST16 "d"
# define PRIdLEAST32 "d"
# define PRIdLEAST64 __PRI64_PREFIX "d"
# define PRIdFAST8 "d"
# define PRIdFAST16 __PRIPTR_PREFIX "d"
# define PRIdFAST32 __PRIPTR_PREFIX "d"
# define PRIdFAST64 __PRI64_PREFIX "d"
# define PRIi8  "i"
# define PRIi16  "i"
# define PRIi32  "i"
# define PRIi64  __PRI64_PREFIX "i"
# define PRIiLEAST8 "i"
# define PRIiLEAST16 "i"
# define PRIiLEAST32 "i"
# define PRIiLEAST64 __PRI64_PREFIX "i"
# define PRIiFAST8 "i"
# define PRIiFAST16 __PRIPTR_PREFIX "i"
# define PRIiFAST32 __PRIPTR_PREFIX "i"
# define PRIiFAST64 __PRI64_PREFIX "i"
/* 八進制格式  */
# define PRIo8  "o"
# define PRIo16  "o"
# define PRIo32  "o"
# define PRIo64  __PRI64_PREFIX "o"
# define PRIoLEAST8 "o"
# define PRIoLEAST16 "o"
# define PRIoLEAST32 "o"
# define PRIoLEAST64 __PRI64_PREFIX "o"
# define PRIoFAST8 "o"
# define PRIoFAST16 __PRIPTR_PREFIX "o"
# define PRIoFAST32 __PRIPTR_PREFIX "o"
# define PRIoFAST64 __PRI64_PREFIX "o"
/* 無符號整數格式  */
# define PRIu8  "u"
# define PRIu16  "u"
# define PRIu32  "u"
# define PRIu64  __PRI64_PREFIX "u"
# define PRIuLEAST8 "u"
# define PRIuLEAST16 "u"
# define PRIuLEAST32 "u"
# define PRIuLEAST64 __PRI64_PREFIX "u"
# define PRIuFAST8 "u"
# define PRIuFAST16 __PRIPTR_PREFIX "u"
# define PRIuFAST32 __PRIPTR_PREFIX "u"
# define PRIuFAST64 __PRI64_PREFIX "u"
/* 小寫十六進制格式  */
# define PRIx8  "x"
# define PRIx16  "x"
# define PRIx32  "x"
# define PRIx64  __PRI64_PREFIX "x"
# define PRIxLEAST8 "x"
# define PRIxLEAST16 "x"
# define PRIxLEAST32 "x"
# define PRIxLEAST64 __PRI64_PREFIX "x"
# define PRIxFAST8 "x"
# define PRIxFAST16 __PRIPTR_PREFIX "x"
# define PRIxFAST32 __PRIPTR_PREFIX "x"
# define PRIxFAST64 __PRI64_PREFIX "x"
/* 大寫十六進制格式  */
# define PRIX8  "X"
# define PRIX16  "X"
# define PRIX32  "X"
# define PRIX64  __PRI64_PREFIX "X"
# define PRIXLEAST8 "X"
# define PRIXLEAST16 "X"
# define PRIXLEAST32 "X"
# define PRIXLEAST64 __PRI64_PREFIX "X"
# define PRIXFAST8 "X"
# define PRIXFAST16 __PRIPTR_PREFIX "X"
# define PRIXFAST32 __PRIPTR_PREFIX "X"
# define PRIXFAST64 __PRI64_PREFIX "X"
/* 打印intmax_t和uintmax_t的格式宏  */
# define PRIdMAX __PRI64_PREFIX "d"
# define PRIiMAX __PRI64_PREFIX "i"
# define PRIoMAX __PRI64_PREFIX "o"
# define PRIuMAX __PRI64_PREFIX "u"
# define PRIxMAX __PRI64_PREFIX "x"
# define PRIXMAX __PRI64_PREFIX "X"

/* 打印intptr_t和uintptr_t的格式宏  */
# define PRIdPTR __PRIPTR_PREFIX "d"
# define PRIiPTR __PRIPTR_PREFIX "i"
# define PRIoPTR __PRIPTR_PREFIX "o"
# define PRIuPTR __PRIPTR_PREFIX "u"
# define PRIxPTR __PRIPTR_PREFIX "x"
# define PRIXPTR __PRIPTR_PREFIX "X"
/* 表示輸入格式控制串的宏  */
/* 有符號十進格式  */
# define SCNd8  "hhd"
# define SCNd16  "hd"
# define SCNd32  "d"
# define SCNd64  __PRI64_PREFIX "d"
# define SCNdLEAST8 "hhd"
# define SCNdLEAST16 "hd"
# define SCNdLEAST32 "d"
# define SCNdLEAST64 __PRI64_PREFIX "d"
# define SCNdFAST8 "hhd"
# define SCNdFAST16 __PRIPTR_PREFIX "d"
# define SCNdFAST32 __PRIPTR_PREFIX "d"
# define SCNdFAST64 __PRI64_PREFIX "d"
/* 有符號十進制格式  */
# define SCNi8  "hhi"
# define SCNi16  "hi"
# define SCNi32  "i"
# define SCNi64  __PRI64_PREFIX "i"
# define SCNiLEAST8 "hhi"
# define SCNiLEAST16 "hi"
# define SCNiLEAST32 "i"
# define SCNiLEAST64 __PRI64_PREFIX "i"
# define SCNiFAST8 "hhi"
# define SCNiFAST16 __PRIPTR_PREFIX "i"
# define SCNiFAST32 __PRIPTR_PREFIX "i"
# define SCNiFAST64 __PRI64_PREFIX "i"
/* 無符號十進制格式  */
# define SCNu8  "hhu"
# define SCNu16  "hu"
# define SCNu32  "u"
# define SCNu64  __PRI64_PREFIX "u"
# define SCNuLEAST8 "hhu"
# define SCNuLEAST16 "hu"
# define SCNuLEAST32 "u"
# define SCNuLEAST64 __PRI64_PREFIX "u"
# define SCNuFAST8 "hhu"
# define SCNuFAST16 __PRIPTR_PREFIX "u"
# define SCNuFAST32 __PRIPTR_PREFIX "u"
# define SCNuFAST64 __PRI64_PREFIX "u"
/* 八進制格式  */
# define SCNo8  "hho"
# define SCNo16  "ho"
# define SCNo32  "o"
# define SCNo64  __PRI64_PREFIX "o"
# define SCNoLEAST8 "hho"
# define SCNoLEAST16 "ho"
# define SCNoLEAST32 "o"
# define SCNoLEAST64 __PRI64_PREFIX "o"
# define SCNoFAST8 "hho"
# define SCNoFAST16 __PRIPTR_PREFIX "o"
# define SCNoFAST32 __PRIPTR_PREFIX "o"
# define SCNoFAST64 __PRI64_PREFIX "o"
/* 十六進制格式  */
# define SCNx8  "hhx"
# define SCNx16  "hx"
# define SCNx32  "x"
# define SCNx64  __PRI64_PREFIX "x"
# define SCNxLEAST8 "hhx"
# define SCNxLEAST16 "hx"
# define SCNxLEAST32 "x"
# define SCNxLEAST64 __PRI64_PREFIX "x"
# define SCNxFAST8 "hhx"
# define SCNxFAST16 __PRIPTR_PREFIX "x"
# define SCNxFAST32 __PRIPTR_PREFIX "x"
# define SCNxFAST64 __PRI64_PREFIX "x"

/* 輸入intmax_t和uintmax_t的格式宏  */
# define SCNdMAX __PRI64_PREFIX "d"
# define SCNiMAX __PRI64_PREFIX "i"
# define SCNoMAX __PRI64_PREFIX "o"
# define SCNuMAX __PRI64_PREFIX "u"
# define SCNxMAX __PRI64_PREFIX "x"
/* 輸入intptr_t和uintptr_t的格式宏  */
# define SCNdPTR __PRIPTR_PREFIX "d"
# define SCNiPTR __PRIPTR_PREFIX "i"
# define SCNoPTR __PRIPTR_PREFIX "o"
# define SCNuPTR __PRIPTR_PREFIX "u"
# define SCNxPTR __PRIPTR_PREFIX "x"
#endif /* C++ && format macros */

__BEGIN_DECLS
#if __WORDSIZE == 64
/* 64位平台 */
/* 我們要使用ldiv_t來定義uintmax_t  */
typedef struct
  {
    long int quot;  /* 商  */
    long int rem;  /* 余數  */
  } imaxdiv_t;
#else  /*  32位平台 */
/* 我們要使用lldiv_t來定義uintmax_t  */
typedef struct
  {
    long long int quot;  /* 商  */
    long long int rem;  /* 余數  */
  } imaxdiv_t;
#endif
/* 計算N的絕對值  */
extern intmax_t imaxabs (intmax_t __n) __THROW __attribute__ ((__const__));
/* 返回NUMER除以DENOM的商和余數,放在imaxdiv_t結構中 */
extern imaxdiv_t imaxdiv (intmax_t __numer, intmax_t __denom)
      __THROW __attribute__ ((__const__));
/* 與strtol類似,但轉換成intmax_t  */
extern intmax_t strtoimax (__const char *__restrict __nptr,
      char **__restrict __endptr, int __base) __THROW;
/* 與strtoul類似,但轉換成uintmax_t  */
extern uintmax_t strtoumax (__const char *__restrict __nptr,
      char ** __restrict __endptr, int __base) __THROW;
/* 與wcstol類似,但轉換成intmax_t  */
extern intmax_t wcstoimax (__const __gwchar_t *__restrict __nptr,
      __gwchar_t **__restrict __endptr, int __base)
    __THROW;
/* 與wcstoul類似,但轉換成uintmax_t  */
extern uintmax_t wcstoumax (__const __gwchar_t *__restrict __nptr,
      __gwchar_t ** __restrict __endptr, int __base)
    __THROW;
   
/* 下面是GNU的擴展:是上面4個標准轉換函數的外部內聯版本,有64位平台和32位平台之分 */
__END_DECLS
#endif /* inttypes.h */

Copyright © Linux教程網 All Rights Reserved