突然間就想到了long和int到底什么區別(發現有很多問題都是突然間想到的),然后百度、google各種查找,各種書籍:《C++ Primer》、《C程序設計語言》查看,終於明白了一些。下面的話選自《C程序設計語言》:
short與long兩個限定符的引入可以為我們提供滿足實際需要的不同長度的整形數。int通常代表特定機器中證書的自然長度。short類型通常為16位,long類型通常為32位,int類型可以為16位或32位。各編譯器可以根據硬件特性自主選擇合適的類型長度,但要遵循下列限制:short與int類型至少為16位,long類型至少為32位,並且short類型不得長於int類型,而int類型不得長於long類型。
下面一段話選自《C++ Primer》:
short、int和long類型都表示整型值,存儲空間的大小不同。一般,short類型為半個機器字長(word)長,int類型為一個機器字長,而long類型為一個或兩個機器字長(在32位機器中int類型和long類型通常字長是相同的)。
這時候我又想到了,不同的機器位下,這三個類型到底有什么區別,short就不說了,從上面兩段介紹來說,short應該都是16位了,那么int和long呢?百度一下(我不喜歡百度,但是google不穩定,只能百度了)。先看列表:
| 類型 |
16位系統/字節 |
32位系統/字節 |
64位系統/字節 |
| char |
1 |
1 |
1 |
| char* |
2 |
4 |
8 |
| short |
2 |
2 |
2 |
| int |
2 |
4 |
4 |
| long |
4 |
4 |
8 |
| long long |
8 |
8 |
8 |
| 數據類型 | 說明 | 32位字節數 | 64位字節數 | 取值范圍 |
|---|---|---|---|---|
| bool | 布爾型 | 1 | 1 | true,false |
| char | 字符型 | 1 | 1 | -128~127 |
| unsigned char | 無符號字符型 | 1 | 1 | 0~255 |
| short | 短整型 | 2 | 2 | -32768~32767 |
| unsigned short | 無符號短整型 | 2 | 2 | 0~65535 |
| int | 整型 | 4 | 4 | -2147483648~2147483647 |
| unsigned int | 無符號整型 | 4 | 4 | 0~4294967295 |
| long | 長整型 | 4 | 8 | – |
| unsigned long | 無符號長整型 | 4 | 8 | – |
| long long | 長整型 | 8 | 8 | -2^64~2^64-1 |
| float | 單精度浮點數 | 4 | 4 | 范圍-2^128~2^128 精度為6~7位有效數字 |
| double | 雙精度浮點數 | 8 | 8 | 范圍-2^1024~2^1024 精度為15~16位 |
| long double | 擴展精度浮點數 | 8 | 8 | 范圍-2^1024~2^1024 精度為15~16位 |
| * | 地址 | 4 | 8 | – |
2的:
8次方:256
16次方:65536
32次方:4 294 967 296
從表中可以看出這么幾個問題,int類型在64位系統下竟然是4個字節32位的。還有,這些玩意兒到底跟什么有關系?是誰在控制着?從網上扒了各種解釋,大概有這么兩點:
1、64位系統下,編譯器為了向前兼容,將int類型自動編譯為4個字節的了;
2、這些個玩意兒就是編譯器來控制的,不同的編譯器將int類型編譯成不同長度的,所以,使用什么編譯器才是重要的,比如:32位系統,tc下的int就是16位長度的,VC就是32位長度的。
3、long long是標准的8 bytes,不受編譯器限制,所以,16位的依然也是8 bytes。(多謝博友0_0i_i 的指正)
通過上面的介紹,應該大致明白整型的定義了吧,所以我們在使用整型變量的時候還是得小心的,尤其需要其所占空間長度的時候,千萬不要想當然的認為int在32位系統下就是4個字節。盡量使用sizeof取值。
