【轉自】:http://blog.csdn.net/a775992553/article/details/8790241
機器字長:是指計算機進行一次整數運算所能處理的二進制數據的位數(整數運算即定點整數運算)。機器字長也就是運算器進行定點數運算的字長,通常也是CPU內部數據通路的寬度。現在一般為32位即4個字節,也有64位和16位的。
算術類型的存儲空間按照機器而定。一般,short類型為半個機器字長,int為一個機器字長,long為1或2個機器字長,float為一個機器字長,double為兩個字,long double用3或4個字長。C++標准規定的是每個算術類型的最小存儲空間,但其並不阻止編譯器用更大的存儲空間。如果要保證移植性,盡量用__int16 __int32 __int64吧,或者自己typedef int INT32一下。
| 數據類型名稱 | 字節數 | 別名 | 取值范圍 |
| int | * | signed,signed int | 由操作系統決定,即與操作系統的"字長"有關 |
| unsigned int | * | unsigned | 由操作系統決定,即與操作系統的"字長"有關 |
| __int8 | 1 | char,signed char | –128 到 127 |
| __int16 | 2 | short,short int,signed short int | –32,768 到 32,767 |
| __int32 | 4 | signed,signed int | –2,147,483,648 到 2,147,483,647 |
| __int64 | 8 | 無 | –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
| bool | 1 | 無 | false 或 true |
| char | 1 | signed char | –128 到 127 |
| unsigned char | 1 | 無 | 0 到 255 |
| short | 2 | short int,signed short int | –32,768 到 32,767 |
| unsigned short | 2 | unsigned short int | 0 到 65,535 |
| long | 4 | long int,signed long int | –2,147,483,648 到 2,147,483,647 |
| long long | 8 | none (but equivalent to __int64) | –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
| unsigned long | 4 | unsigned long int | 0 到 4,294,967,295 |
| enum | * | 無 | 由操作系統決定,即與操作系統的"字長"有關 |
| float | 4 | 無 | 3.4E +/- 38 (7 digits) |
| double | 8 | 無 | 1.7E +/- 308 (15 digits) |
| long double | 8 | 無 | 1.7E +/- 308 (15 digits) |
| wchar_t | 2 | __wchar_t | 0 到 65,535 |
(P:指針的大小為定值4個字節)
32位機器環境下結果如下:
| 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> 對函數返回和函數參數的限定,例如自定義既不帶參數也無返回值的函數voidMyFunc(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)在Win32API及MFC中為了使類型名稱在語意上更明了,對以上基本類型進行了大量的typedef。例如WINDEF.H中的BYTE,WORD,DWORD。
