C++與C#數據類型比較總結

    在進行平臺間的調用時(如在.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)類型修飾符signedunsigned用於修飾字符型和整形。

2)類型修飾符shortlong用於修飾字符型和整形。

3)當用signedunsignedshortlong修飾int整形時,int可省略。

4)其中boolwchar_tC++特有的。

5)除上表以外,C/C++都可以自定義枚舉enum、聯合unionstruct結構體類型。

6)以上sizeof通過Windows XP 32位平臺測試,其中某些類型數據的字節數和數值範圍由操作系統和編譯平臺決定。比如16位機上,sizeof(int) = 2,而32位機上sizeof(int) = 432位機上sizeof(long) = 4,而64位機上sizeof(long) = 8。除此之外,注意64位機上的pointer8byte

7void的字面意思是無類型,不能用來定義變量。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位平臺下的intlong

long從字面上看,應該是64位才更合理,把long當成32位實在是一個歷史的包袱。像C#那樣新起爐竈的程序語言,由於沒有需要支持老代碼的問題,就把long當作64位來處理了。

32位平臺下,long是相對short而言,longshort)類型是longshort int類型的簡稱,sizeof(long) = sizeof(int) = 4intlong的範圍雖然一樣,但輸入輸出格式不同,printf int的格式爲%d,而printf long的格式爲%ld

考慮到程序的可移植性,還是要將他們區分開來。但當要求的數值範圍爲4byte時,建議使用int類型,因爲第一版的C語言只有一種類型,那就是int

11)在Win32 APIMFC中爲了使類型名稱在語意上更明瞭,對以上基本類型進行了大量的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章