先聲明,每種環境之資料型態所佔用位元數不盡相同,
以 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
留言列表