char,short,int,long,longlong,unsignedlonglong数据范围
速查表:
char -128 ~ +127 (1 Byte)
short -32767 ~ + 32768 (2 Bytes)
unsigned short 0 ~ 65535 (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的最⼤值:18446744073709551615
__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位。
float数值范围
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 类型的长度、精度及表⽰范围与所使⽤的编译器、操作系统等有关。