char,short ,int ,long,long long,unsigned long long數據範圍

速查表:

char -128 ~ +127 (1 Byte)
short -32767 ~ + 32768 (2 Bytes)
unsigned short 0 ~ 65536 (2 Bytes)
int -2147483648 ~ +2147483647 (4 Bytes)
unsigned int 0 ~ 4294967295 (4 Bytes)
long == int
long long -9223372036854775808 ~ +9223372036854775807 (8 Bytes)
double 1.7 * 10^308 (8 Bytes)

unsigned int 0~4294967295
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

詳細教程:

====================

符號屬性 長度屬性 基本型 所佔位數 取值範圍 輸入符舉例 輸出符舉例 
char   8    -2^7 ~ 2^7-1 %c %c 
 %d  %u
signed -- char 8 -2^7 ~ 2^7-1 %c %c
 
 %d  
%u
unsigned -- char 8 0 ~ 2^8-1 %c %c
 
 %d  
%u
[signed] short [int] 16 -2^15 ~ 2^15-1 %hd
unsigned short [int] 16 0 ~ 2^16-1 %hu
 
 %ho  
%hx
[signed] -- int 32 -2^31 ~ 2^31-1 %d
unsigned -- [int] 32 0 ~ 2^32-1 %u
 
 %o  
%x
[signed] long [int] 32 -2^31 ~ 2^31-1 %ld
unsigned long [int] 32 0 ~ 2^32-1 %lu
 
 %lo  
%lx
[signed] long long [int] 64 -2^63 ~ 2^63-1 %I64d
unsigned long long [int] 64 0 ~ 2^64-1 %I64u
 
 %I64o  
%I64x
-- -- float 32 +/- 3.40282e+038 %f
 
 %e  
%g
-- -- double 64 +/- 1.79769e+308 %lf
 
 %le  %lg %f  %e  
%g
-- long double 96 +/- 1.79769e+308 %Lf
 
 %Le  
%Lg

幾點說明: 


1. 
注意 表中的每一行,代表一種基本類型。 “[]” 代表可省略。 
例如: char  signed char  unsigned char 是三種互不相同的類型; 
int
 
 short  long 也是三種互不相同的類型。 

2. char/signed char/unsigned char 
型數據長度爲 1 字節;
char 
爲有符號型,但與 signed char 是不同的類型。 
注意 並不是所有編譯器都這樣處理, char 型數據長度不一定爲 1 字節, char 也不一定爲有符號型。 

3. 
 char/signed char 轉換爲 int 時,會對最高符號位 1 進行擴展,從而造成運算問題。 
所以 , 如果要處理的數據中存在字節值大於 127 的情況,使用 unsigned char 較爲妥當。 
程序中若涉及位運算,也應該使用 unsigned 型變量。 

4. char/signed char/unsigned char 
輸出時,使用格式符 %c (按字符方式); 或使用 %d  %u  %x/%X %o ,按整數方式輸出; 輸入時,應使用 %c ,若使用整數方式, Dev-C++ 會給出警告,不建議這樣使用。 

5. int 
的長度,是 16 位還是 32 位,與編譯器字長有關。 
16 
位編譯器(如 TC 使用的編譯器)下, int  16 位; 32 位編譯器(如 VC 使用的編譯器 cl.exe )下, int 32位。 

6. 
整型數據可以使用 %d (有符號 10 進制)、 %o (無符號 8 進制)或 %x/%X (無符號 16 進制)方式輸入輸出。 而格式符 %u ,表示 unsigned ,即無符號 10 進制方式。 

7. 
整型前綴 h 表示 short  l 表示 long  
輸入輸出 short/unsigned short 時,不建議直接使用 int 的格式符 %d/%u 等,要加前綴 h 這個習慣性錯誤,來源於 TC  TC 下, int 的長度和默認符號屬性,都與 short 一致,於是就把這兩種類型當成是相同的,都用 int方式進行輸入輸出。 

8. 
關於 long long 類型的輸入輸出: 
"%lld" 
 "%llu"  linux  gcc/g++ 用於 long long int 類型 (64 bits) 輸入輸出的格式符。 
 "%I64d"  "%I64u" 則是 Microsoft VC++ 庫裏用於輸入輸出 __int64 類型的格式說明。 

Dev-C++
 
使用的編譯器是 Mingw32  Mingw32  x86-win32 gcc 子項目之一,編譯器核心還是 linux 下的 gcc
進行函數參數類型檢查的是在編譯階段, gcc 編譯器對格式字符串進行檢查,顯然它不認得 "%I64d"  
所以將給出警告 “unknown conversion type character `I' in format” 。對於 "%lld"  "%llu"  gcc所當然地接受了。 

Mingw32
 
在編譯期間使用 gcc 的規則檢查語法,在連接和運行時使用的卻是 Microsoft 庫。 
這個庫裏的 printf  scanf 函數當然不認識 linux gcc  "%lld"  "%llu" ,但對 "%I64d"  "%I64u" ,它則是 樂意接受,並能正常工作的。 

9. 
浮點型數據輸入時可使用 %f  %e/%E  %g/%G  scanf 會根據輸入數據形式,自動處理。 
輸出時可使用 %f (普通方式)、 %e/%E (指數方式)或 %g/%G (自動選擇)。 

10. 
浮點參數壓棧的規則: float(4 字節 ) 類型擴展成 double(8 字節 ) 入棧。 
所以在輸入時,需要區分 float(%f)  double(%lf) ,而在輸出時,用 %f 即可。 
printf
 
函數將按照 double 型的規則對壓入堆棧的 float( 已擴展成 double)  double 型數據進行輸出。 
如果在輸出時指定 %lf 格式符, gcc/mingw32 編譯器將給出一個警告。 

11. Dev-C++(gcc/mingw32) 
可以選擇 float 的長度,是否與 double 一致。 

12. 
前綴 L 表示 long  double )。 
雖然 long double  double  4 個字節,但是表示的數值範圍卻是一樣的。 
long double
 
類型的長度、精度及表示範圍與所使用的編譯器、操作系統等有關。

發佈了15 篇原創文章 · 獲贊 18 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章