在進行平臺間的調用時(如在.NET程序中使用VC++動態鏈接庫)不可避免需要進行VC++數據結構和函數接口的重寫,這其中便涉及到C++數據結構到C#數據結構的轉換。下面將個人整理的一個內容貼出來:
- (1)C/C++數據結構
Type |
Size |
數值範圍 |
無值型void |
0 byte |
無值域 |
布爾型bool |
1 byte |
true false |
有符號短整型short [int] /signed short [int] |
2 byte |
-32768~32767 |
無符號短整型unsigned short [int] |
2 byte |
0~65535 |
有符號整型int /signed [int] |
4 byte |
-2147483648~2147483647 |
無符號整型unsigned [int] |
4 byte |
0~4294967295 |
有符號長整型long [int]/signed long [int] |
4 byte |
-2147483648~2147483647 |
無符號長整型unsigned long [int] |
4 byte |
0~4294967295 |
long long |
8 byte |
0~18446744073709552000 |
有符號字符型char/signed char |
1 byte |
-128~127 |
無符號字符型unsigned char |
1 byte |
0~255 |
寬字符型wchar_t (unsigned short.) |
2 byte |
0~65535 |
單精度浮點型float |
4 byte |
-3.4E-38~3.4E+38 |
雙精度浮點型double |
8 byte |
1.7E-308~1.7E+308 |
long double |
8 byte |
說明:
(1)類型修飾符signed和unsigned用於修飾字符型和整形。
(2)類型修飾符short和long用於修飾字符型和整形。
(3)當用signed和unsigned、short和long修飾int整形時,int可省略。
(4)其中bool和wchar_t是C++特有的。
(5)除上表以外,C/C++都可以自定義枚舉enum、聯合union和struct結構體類型。
(6)以上sizeof通過Windows XP 32位平臺測試,其中某些類型數據的字節數和數值範圍由操作系統和編譯平臺決定。比如16位機上,sizeof(int) = 2,而32位機上sizeof(int) = 4;32位機上sizeof(long) = 4,而64位機上sizeof(long) = 8。除此之外,注意64位機上的pointer佔8byte。
(7)void的字面意思是“無類型”,不能用來定義變量。void真正發揮的作用在於:<1> 對函數返回和函數參數的限定,例如自定義既不帶參數也無返回值的函數void MyFunc(void);<2>定義無類型通用指針void *,指向任何類型的數據。
(8)標準C++庫及STL還提供了通用數據結構:字符串類string;向量類模板vector;雙端隊列類模板deque;鏈表類模板list;容器適配器堆棧類stack(實現先進後出的操作);容器適配器隊列類queue(實現先進先出的操作);集合類set;多重集合類multiset;映射類map;多重映射類multimap;位集合bitset;迭代器iterator (類似指針的功能,對容器的內容進行訪問)。
(9)在標準c++中,int的定義長度要依靠你的機器的字長,也就是說,如果你的機器是32位的,int的長度爲32位,如果你的機器是64位的,那麼int的標準長度就是64位,而vc中__int64是爲在32機位機器長實現64位長度的整形數。
(10)關於32位平臺下的int和long
long從字面上看,應該是64位才更合理,把long當成32位實在是一個歷史的包袱。像C#那樣新起爐竈的程序語言,由於沒有需要支持老代碼的問題,就把long當作64位來處理了。
在32位平臺下,long是相對short而言,long(short)類型是long(short) int類型的簡稱,sizeof(long) = sizeof(int) = 4。int和long的範圍雖然一樣,但輸入輸出格式不同,printf int的格式爲%d,而printf long的格式爲%ld。
考慮到程序的可移植性,還是要將他們區分開來。但當要求的數值範圍爲4byte時,建議使用int類型,因爲第一版的C語言只有一種類型,那就是int。
(11)在Win32 API及MFC中爲了使類型名稱在語意上更明瞭,對以上基本類型進行了大量的typedef。例如WINDEF.H中的BYTE,WORD,DWORD。
(12)計算機內部內存的基本單位是1byte(8個電子開關)!
- (2)C#數據類型
簡單類型
|
描 述
|
示 例
|
sbyte | 8-bit 有符號整數 | sbyte val = 12; |
short | 16-bit 有符號整數 | short val = 12; |
int | 32-bit有符號整數 | int val = 12; |
long | 64-bit有符號整數 | long val1 = 12; long val2 = 34L; |
byte | 8-bit無符號整數 | byte val1 = 12; byte val2 = 34U; |
ushort | 16-bit 無符號整數 | ushort val1 = 12; ushort val2 = 34U; |
uint | 32-bit 無符號整數 | uint val1 = 12; uint val2 = 34U; |
ulong | 64-bit 無符號整數 | ulong val1 = 12; ulong val2 = 34U; ulong val3 = 56L; ulong val4 = 78UL; |
float | 32-bit單精度浮點數 | float val = 1.23F; |
double | 64-bit雙精度浮點數 | double val1 = 1.23; double val2 = 4.56D; |
l | 布爾類型 | bool val1 = true; bool val2 = false; |
char | 字符類型 ,Unicode編碼 | char val = 'h'; |
decimal | 28個有效數字的128-bit十進制類型 | decimal val = 1.23M; |
- (3)C與C#對應數據結構
API與C#的數據類型對應關係表
|
|||||
API數據類型 | 類型描述 | C#類型 | API數據類型 | 類型描述 | C#類型 |
WORD | 16位無符號整數 | ushort | CHAR | 字符 | char |
LONG | 32位無符號整數 | int | DWORDLONG | 64位長整數 | long |
DWORD | 32位無符號整數 | uint | HDC | 設備描述表句柄 | int |
HANDLE | 句柄,32位整數 | int | HGDIOBJ | GDI對象句柄 | int |
UINT | 32位無符號整數 | uint | HINSTANCE | 實例句柄 | int |
BOOL | 32位布爾型整數 | bool | HWM | 窗口句柄 | int |
LPSTR | 指向字符的32位指針 | string | HPARAM | 32位消息參數 | int |
LPCSTR | 指向常字符的32位指針 | String | LPARAM | 32位消息參數 | int |
BYTE | 字節 | byte | WPARAM | 32位消息參數 | int |