關於 size_t , uintptr_t , intptr_t, int

C++標準沒有規定size_t , uintptr_t , intptr_t, int 這幾個東西的byte數,所以任何確定地說這幾個東西沒區別,或者

確定地說這幾個東西佔XX個bit的行爲都是耍流氓. 那麼這幾個東西有什麼區別呢? 


int : 這個不用說了吧

size_t : 在當前平臺下可能出現的最大數組尺寸.size_t必須是個unsigned但沒有規定這個數和int的關係.

這個數在MSVC下是typedef unsigned int size_t, 但不要認爲size_t 就是uint.

C++標準只規定了size_t 的最大值在當前目標平臺(或者編譯器)下一定能容納的數組的最大尺寸. 假如我們有個平臺,最大

數組尺寸爲2^32 bit,那麼size_t 的bit數可能是32,33,34.... 但不會小於32. 因爲他必須能夠表示當前平臺下最大的數組尺寸那個值.

它和unsigned int的關係就是它們根本沒有關係. 在某個目標平臺下, unsigned int 沒準是256個bit,而size_t 是16bit,這也是可能的.


intptr_t ,uintptr_t : 表示當前平臺下能夠安全地對指針進行轉型的整型變量. 有些時候,我們不得不對一些指針進行一些整型轉換

來執行一些指針類型無法操作的功能. 會寫這樣的代碼: 

float* p=new float[...];
//.........................
int a=(int)p;
這是不安全的,因爲C++標準沒有規定int類型一定能夠容納float*類型的全部值. 例如在某個特定平臺下, float* 可能佔4byte,但int只佔2byte.

比較安全的轉換是:

float* p=new float[...];
//.........................
intptr_t a=(intptr_t)p;
uintptr_t a2=(uintptr_t)p;
此時是相對安全的,因爲intptr_t和uintptr_t和float* 所佔byte數是一樣的.

intptr_t 和uintptr_t 顯然是一個有符號一個無符號,但實際上我認爲這倆沒什麼區別,因爲有符號和無符號對加減法,求餘來說計算出來的是一樣的數值.

至於乘除法......我實在想不出來對一個指針轉過來的整型做乘除法有什麼意義..

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章