C數據類型 基本類型 數值類型 整型 短整型short 整型int 長整形long 浮點型 單精度型float 雙精度型double 字元類型char 構造類型 數組 結構體struct 共用體union 枚舉類型enum 指針類型 空類型void 符號屬性 長度屬性 基本型 位長(位元組) 取值範圍 ...
C數據類型 |
基本類型 |
數值類型 |
整型 |
短整型short |
整型int |
||||
長整形long |
||||
浮點型 |
單精度型float |
|||
雙精度型double |
||||
字元類型char |
|
|
||
構造類型 |
數組 |
|
|
|
結構體struct |
|
|
||
共用體union |
|
|
||
枚舉類型enum |
|
|
||
指針類型 |
|
|
|
|
空類型void |
|
|
|
符號屬性 |
長度屬性 |
基本型 |
位長(位元組) |
取值範圍 |
輸入符 |
輸出符 |
-- |
-- |
char |
1 |
-2^7~2^7-1(或0..255,與體繫結構有關) |
%c |
%c、%d、%u |
signed |
-- |
char |
1 |
-2^7~2^7-1 |
%c |
%c、%d、%u |
unsigned |
-- |
char |
1 |
0~2^8-1 |
%c |
%c、%d、%u |
-- |
short |
[int] |
2 |
-2^15~2^15-1 |
%hd %hi |
|
signed |
short |
[int] |
2 |
-2^15~2^15-1 |
%hd %hi |
|
unsigned |
short |
[int] |
2 |
0~2^16-1 |
%hu %ho %hx |
|
-- |
-- |
int |
2/4 |
-2^31~2^31-1 |
%d %i |
|
signed |
-- |
int |
2/4 |
-2^31~2^31-1 |
%d %i |
|
unsigned |
-- |
int |
2/4 |
0~2^32-1 |
%u %o %x |
|
-- |
long |
[int] |
4/8 |
-2^31~2^31-1 |
%ld %li |
|
signed |
long |
[int] |
4/8 |
-2^31~2^31-1 |
%ld %li |
|
unsigned |
long |
[int] |
4/8 |
0~2^32-1 |
%lu %lo %lx |
|
-- |
long long |
[int] |
8 |
-2^63~2^63-1 |
%I64d %lld %Ili |
|
signed |
long long |
[int] |
8 |
-2^63~2^63-1 |
%I64d %lld %Ili |
|
unsigned |
long long |
[int] |
8 |
0~2^64-1 |
%I64u %I64o %I64x |
|
-- |
-- |
float |
4 |
+/-3.40282e+038 |
%f %e %g |
|
-- |
-- |
double |
8 |
+/-1.79769e+308 |
%lf %le %lg |
%f、%e、%g |
-- |
long |
double |
8或以上 |
+/-1.79769e+308 |
%Lf %Le %Lg |
|
註意:
1、 表中的每一行,代表一種基本類型。“[]”代表可省略。
2、 char、signed char、unsigned char是三種互不相同的類型;int、short、long也是三種互不相同的類型。
3、 將char/signed char轉換為int時,會對最高符號位1進行擴展,從而造成運算問題。所以,如果要處理的數據中存在位元組值大於127的情況,使用unsigned char較為妥當。程式中若涉及位運算,也應該使用unsigned型變數。
4、 int的長度,是16位還是32位,與編譯器字長有關。
5、 整型數據可以使用%d(有符號10進位)、%o(無符號8進位)或%x/%X(無符號16進位)方式輸入輸出。而格式符%u,表示unsigned,即無符號10進位方式。
6、 整型首碼h表示short,l表示long。輸入輸出short/unsigned short時,不建議直接使用int的格式符%d/%u等,要加首碼h。(使用相匹配的格式對數據類型進行輸入輸出)
7、 關於long long類型的輸入輸出:"%lld"和"%llu"是linux下gcc/g++用於long long int類型(64 bits)輸入輸出的格式符。而"%I64d"和"%I64u"則是Microsoft VC++庫里用於輸入輸出__int64類型的格式說明。
8、 浮點型數據輸入時可使用%f、%e/%E或%g/%G,scanf函數會根據輸入數據形式,自動處理。輸出時可使用%f(普通方式)、%e/%E(指數方式)或%g/%G(自動選擇)。
9、 浮點參數壓棧的規則:float(4位元組)類型擴展成double(8位元組)入棧。在輸入時,需要區分float(%f)與double(%lf);在輸出時,用%f即可。printf函數將按照double型的規則對壓入堆棧的float(已擴展成double)和double型數據進行輸出。如果在輸出時指定%lf格式符,gcc/mingw32編譯器將給出一個警告。
10、 首碼L表示long(double)。雖然long double比double長4個位元組,但是表示的數值範圍卻是一樣的。long double類型的長度、精度及表示範圍與所使用的編譯器、操作系統等有關。
64位整數全解
64位整形引起的混亂主要在兩方面:一是數據類型的聲明,二是輸入輸出。
首先是如果我們在自己機器上寫程式的話,情況分類如下:
(1) 在win下的VC6.0裡面,聲明數據類型的時候應該寫作
__int64 a;
輸入輸出的時候用%I64d
scanf(”%I64d”,&a);
printf(”%I64d”,a);
(2) 在linux下的gcc/g++裡面,數據類型聲明寫作
long long a;
輸入輸出時候用%lld
(3) 在win下的其它IDE裡面[包括高版本Visual Studio],數據類型聲明用上面兩種均可。
輸入輸出用 %I64d
數據類型轉換
數據類型轉換就是將數據(變數、表達式的結果)從一種類型轉換到另一種類型。
強制類型轉換:由程式員顯式進行的轉換。
自動類型轉換:編譯器根據混合運算中不同數據類型隱式地進行數據類型轉換。
類型自動轉換的規則:
註:
1、 char型和short型參與運算時,必須先轉換成int型。
2、 在賦值運算中,賦值號兩邊的數據類型不同時,需要把右邊表達式的類型將轉換為左邊變數的類型。如果右邊表達式的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度。