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是該類型的寬度。
解釋:
(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類似。
注意對于inttypes.h和stdlib.h中的絕對值函數和除法運算函數,很容易實現,編譯器通常把它們當作內部函數(標準C中允許這樣做),因此在glibc中并沒有這些函數的源代碼。
3、strtoimax和strtoumax函數: 將字符串轉換成intmax_t類型的整數,一個為有符號,一個為無符號。其實現都是調用內部函數來完成的。
4、wcstoimax和wcstoumax函數: 將寬字符串轉換成intmax_t類型的整數,一個為有符號,一個為無符號。其實現也都是調用內部函數來完成的。
新聞熱點
疑難解答
圖片精選