先聲明,每種環境之資料型態所佔用位元數不盡相同,
以 int 為例,16 位元電腦 int 佔 16 bits;32 位元電腦 佔 32bits;
但可以確定的是: short int <= int <= long int
至於詳細情形,仍需依使用者環境所定,下述為 32 位元電腦之情形。

 

1. 整數型別

char ( 8 bits) : -128~127  (%c)
unsigned char (8 bits):0~255

int ( 32 bits):-2147483648 ~ 2147483647 (%d) (%i)
unsigned int( 32 bits):0~ 4294697295(四十二億) (%u)

[lemma] %d : dec; %i : integer,於 scanf 時有部份差異 (%d 只接受10進位, %i 可接受指定進位,如 0x23, 045),但於 printf 時 %d, %i 並無顯著差異 (感謝 Jacob Lee 補充指導)

short int(16 bits):-32768 ~ 32767 (%h)
unsigned short int(16 bits) 0~ 65535(六萬五千) (%hu)

long int(32 bits):-2147483648 ~ 2147483647 (%ld)
unsigned long(32 bits):0~ 4294697295(四十二億) (ULONG_MAX, %lu)

long long int (64bits) :  -9223372036854775808 ~ 9223372036854775807 (%lld)
unsigned long long (64 bits): 0 ~ 18446744073709551615 (ULONG_MAX, 一千八百京) (%llu)

事實上,上述之數值大多都可於 climits (limits.h) 裡找到,
甚至可以找出該資料型態佔用之 bit 數,

#define CHAR_BIT      8
#define SCHAR_MIN   (-128)
#define SCHAR_MAX     127
#define UCHAR_MAX     0xff 

#define SHRT_MIN    (-32768)
#define SHRT_MAX      32767
#define USHRT_MAX     0xffff

關於其它定義,請詳見 limits.h

 

2. 浮點數型別

事實上有關浮點數的相關值都定義在 cfloat (float.h) 裡,
同樣的問題, long double >= double,
但不表示 long double 使用位元數必大於 double。

這裡截取其中的 double 與 float 定義做部份翻譯

double , sizeof(double) = 8 , %lf

// 有效位數15位
#define DBL_DIG         15  
// 精準度, 使 1.0 + DBL_EPSILION!=1.0
#define DBL_EPSILON     2.2204460492503131e-016
// 指數位數
#define DBL_MANT_DIG    53      
// 最大值         
#define DBL_MAX         1.7976931348623158e+308
// 最大十進制指數
#define DBL_MAX_10_EXP  308  
// 最大二進制指數                  
#define DBL_MAX_EXP     1024  
// 最小正整數                 
#define DBL_MIN         2.2250738585072014e-308 
// 最小十進制指數
#define DBL_MIN_10_EXP  (-307)       
// 最小二進制指數          
#define DBL_MIN_EXP     (-1021)  
 // 指數進制基底              
#define _DBL_RADIX      2                      
#define _DBL_ROUNDS     1

float , sizeof(float) = 4 , %f

// 有效位數6位
#define FLT_DIG         6  
// 精準度, 使 1.0 + FLT_EPSILION!=1.0
#define FLT_EPSILON     1.192092896e-07F
#define FLT_GUARD       0
// 指數位數
#define FLT_MANT_DIG    24
// 最大值 
#define FLT_MAX         3.402823466e+38F
// 最大十進制指數
#define FLT_MAX_10_EXP  38
// 最大二進制指數
#define FLT_MAX_EXP     128
// 最小正整數
#define FLT_MIN         1.175494351e-38F
// 最小十進制指數
#define FLT_MIN_10_EXP  (-37)
// 最小二進制指數
#define FLT_MIN_EXP     (-125)
#define FLT_NORMALIZE   0
#define FLT_RADIX       2
#define FLT_ROUNDS      1

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()