C数据类型 | 基本类型 | 数值类型 | 整型 | 短整型short |
整型int | ||||
长整形long | ||||
浮点型 | 单精度型float | |||
双精度型double | ||||
字符类型char |
|
| ||
构造类型 | 数组 |
|
| |
结构体struct |
|
| ||
共用体union |
|
| ||
枚举类型enum |
|
| ||
指针类型 |
|
|
| |
空类型void |
|
|
|
符号属性 | 长度属性 | 基本型 | 位长(字节) | 取值范围 | 输入符 | 输出符 |
-- | -- | char | 1 | -2^7~2^7-1(或0..255,与体系结构有关) | %c | %c、%d、%u |
signed | -- | char | 1 | -2^7~2^7-1 | %c | %c、%d、%u |
unsigned | -- | char | 1 | 0~2^8-1 | %c | %c、%d、%u |
-- | short | [int] | 2 | -2^15~2^15-1 | %hd %hi |
|
signed | short | [int] | 2 | -2^15~2^15-1 | %hd %hi |
|
unsigned | short | [int] | 2 | 0~2^16-1 | %hu %ho %hx |
|
-- | -- | int | 2/4 | -2^31~2^31-1 | %d %i |
|
signed | -- | int | 2/4 | -2^31~2^31-1 | %d %i |
|
unsigned | -- | int | 2/4 | 0~2^32-1 | %u %o %x |
|
-- | long | [int] | 4/8 | -2^31~2^31-1 | %ld %li |
|
signed | long | [int] | 4/8 | -2^31~2^31-1 | %ld %li |
|
unsigned | long | [int] | 4/8 | 0~2^32-1 | %lu %lo %lx |
|
-- | long long | [int] | 8 | -2^63~2^63-1 | %I64d %lld %Ili |
|
signed | long long | [int] | 8 | -2^63~2^63-1 | %I64d %lld %Ili |
|
unsigned | long long | [int] | 8 | 0~2^64-1 | %I64u %I64o %I64x |
|
-- | -- | float | 4 | +/-3.40282e+038 | %f %e %g |
|
-- | -- | double | 8 | +/-1.79769e+308 | %lf %le %lg | %f、%e、%g |
-- | long | double | 8或以上 | +/-1.79769e+308 | %Lf %Le %Lg |
|
注意:
1、 表中的每一行,代表一种基本类型。“[]”代表可省略。
2、 char、signed char、unsigned char是三种互不相同的类型;int、short、long也是三种互不相同的类型。
3、 将char/signed char转换为int时,会对最高符号位1进行扩展,从而造成运算问题。所以,如果要处理的数据中存在字节值大于127的情况,使用unsigned char较为妥当。程序中若涉及位运算,也应该使用unsigned型变量。
4、 int的长度,是16位还是32位,与编译器字长有关。
5、 整型数据可以使用%d(有符号10进制)、%o(无符号8进制)或%x/%X(无符号16进制)方式输入输出。而格式符%u,表示unsigned,即无符号10进制方式。
6、 整型前缀h表示short,l表示long。输入输出short/unsigned short时,不建议直接使用int的格式符%d/%u等,要加前缀h。(使用相匹配的格式对数据类型进行输入输出)
7、 关于long long类型的输入输出:"%lld"和"%llu"是linux下gcc/g++用于long long int类型(64 bits)输入输出的格式符。而"%I64d"和"%I64u"则是Microsoft VC++库里用于输入输出__int64类型的格式说明。
8、 浮点型数据输入时可使用%f、%e/%E或%g/%G,scanf函数会根据输入数据形式,自动处理。输出时可使用%f(普通方式)、%e/%E(指数方式)或%g/%G(自动选择)。
9、 浮点参数压栈的规则:float(4字节)类型扩展成double(8字节)入栈。在输入时,需要区分float(%f)与double(%lf);在输出时,用%f即可。printf函数将按照double型的规则对压入堆栈的float(已扩展成double)和double型数据进行输出。如果在输出时指定%lf格式符,gcc/mingw32编译器将给出一个警告。
10、 前缀L表示long(double)。虽然long double比double长4个字节,但是表示的数值范围却是一样的。long double类型的长度、精度及表示范围与所使用的编译器、操作系统等有关。
64位整数全解
64位整形引起的混乱主要在两方面:一是数据类型的声明,二是输入输出。
首先是如果我们在自己机器上写程序的话,情况分类如下:
(1) 在win下的VC6.0里面,声明数据类型的时候应该写作
__int64 a;
输入输出的时候用%I64d
scanf(”%I64d”,&a);
printf(”%I64d”,a);
(2) 在linux下的gcc/g++里面,数据类型声明写作
long long a;
输入输出时候用%lld
(3) 在win下的其它IDE里面[包括高版本Visual Studio],数据类型声明用上面两种均可。
输入输出用 %I64d
数据类型转换
数据类型转换就是将数据(变量、表达式的结果)从一种类型转换到另一种类型。
强制类型转换:由程序员显式进行的转换。
自动类型转换:编译器根据混合运算中不同数据类型隐式地进行数据类型转换。
类型自动转换的规则:
注:
1、 char型和short型参与运算时,必须先转换成int型。
2、 在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型将转换为左边变量的类型。如果右边表达式的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。