C语⾔各种数据类型取值范围
速查表:
char-128 ~ +1271Byte-2^7 ~ 2^7-1
unsigned char0 ~ 2551Byte0 ~ 2^8-1
short-32767 ~ + 32768 2 Bytes -2^15 ~ 2^15-1
unsigned short0 ~ 65536 2 Bytes 0 ~ 2^16-1
int/long-2147483648 ~ +2147483647 4 Bytes -2^31 ~ 2^31-1
unsigned int/long0 ~ 4294967295 4 Bytes 0 ~ 2^32-1
long long-9223372036854775808 ~ +92233720368547758078 Bytes -2^63 ~ 2^63-1
unsigned long long0 ~ 184467440737095516158 Bytes 0 ~ 2^64-1
float 4 Bytes +/- 3.40282e+038
double8 Bytes+/- 1.79769e+308
⼏点说明:
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 型变量。
float数值范围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 类型的长度、精度及表⽰范围与所使⽤的编译器、操作系统等有关。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论