数值类型分为整型(整数)和浮点型(小数)。按照表示数字范围的从大到小
char
)、短整型(short
)、整型(int
)、长整型(long
)和长长整型(long long
)float
)、双精度型(double
)和长双精度型(long double
)关键字sizeof
:查看变量或者类型大小
int n;
printf("%d",sizeof(int));
printf("%d",sizeof(n));
上面的括号不是必须的,但是建议带上。所以也可以如下表示:
int n;
printf("%d",sizeof int);
printf("%d",sizeof n);
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(short)=%d\n",sizeof(short));
printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(long)=%d\n",sizeof(long));
printf("sizeof(long long)=%d\n",sizeof(long long));
printf("sizeof(float)=%d\n",sizeof(float));
printf("sizeof(double)=%d\n",sizeof(double));
printf("sizeof(long double)=%d\n",sizeof(long double));
在编译命令加上选项-m32
再试一下。
通常有些类型大小并不是固定的,计算机硬件、操作系统和编译器都会影响类型的大小。通常类型大小有如下规律:
char < short < int < float < double
int <= long <= long long
在常用的计算机硬件和操作系统中,各种类型的大小如下表所示:
sizeof
获得数据的单位是Byte(字节)。Byte(字节)是计量存储容量的一种计量单位,一个字节是8位二进制,可容纳256个数字。一个ASCII字符就是一个字节。
除了Byte(字节),还有其他常用存储容量单位
NO. | 单位 | 说明 |
---|---|---|
1 | bit(比特/位) | 计算机中的最小数据单位,1个Byte(字节)=8个bit(比特/位) |
2 | word(字) | 计算机CPU一次操作处理实际数据最大位数,我们常说的32/64位就是计算机的字。 |
3 | KB | 1KB=1024B |
4 | MB | 1MB=1024KB |
5 | GB | 1GB=1024MB |
6 | TB | 1TB=1024GB |
有时,我们用
B
表示Byte(字节),用b
表示bit(比特/位),注意两者区别。
No. | 类型 | 占位符 |
---|---|---|
1 | char |
%c |
2 | short |
%hd |
3 | int |
%d |
4 | long |
%ld |
5 | long long |
%lld |
6 | float |
%f |
7 | double |
%lf |
8 | long double |
%Lf |
double的输入占位符必须是
%lf
,输出占位符可以是%f
。
每种数据类型大小不同,各自表示数据范围也不同。下面的常用类型的范围。
No. | 类型 | 数字范围 | 表示 |
---|---|---|---|
1 | char |
-128~127 |
-27~27-1 |
2 | short |
-32 768~32 767 约(-3万 ~ +3万) |
-215~215-1 |
3 | int |
-2 147 483 648~2 147 483 647 约(-21亿 ~ +21亿) |
-231~231-1 |
4 | long long |
-9 223 372 036 854 775 808~9 223 372 036 854 775 807 约(-1020亿~ +1020亿) |
-263~263-1 |
上面的是通常范围(32位下),实际上有些情况略有出入。总之,类型的表示范围与类型大小存在如下关系:
其中,n
是类型大小(bit
)。
在一些特殊情况下,数据只用0
和整数,不存在负数,这时可以使用无符号整型unsigned
。无符号整型只是在原来的整型前加上关键字unsigned
。因为没有负数,所以数值的表示范围扩大了一倍。
No. | 类型 | 数字范围 | 表示 |
---|---|---|---|
1 | unsigned char |
0~255 | 0~28-1 |
2 | unsigned short |
0~65 535约+6万 | 0~216-1 |
3 | unsigned int |
0~4 294 967 295约+43亿 | 0~232-1 |
4 | unsigned long long |
0~18 446 744 073 709 551 615 | 0~264-1 |
类型的表示范围与类型大小存在如下关系:
其中,n
是类型大小(bit
)。
输入输出无符号整型格式
No. | 类型 | 占位符 |
---|---|---|
1 | char |
%u |
2 | short |
%hu |
3 | int |
%u |
4 | long |
%lu |
5 | long long |
%llu |
整型类型很多,通常遵循下面的使用规则:
运行下面程序,分析执行结果:
#include
int main(){
printf("1.0/0.0 = %f\n",1.0/0.0);
printf("-1.0/0.0 = %f\n",-1.0/0.0);
printf("0.0/0.0 = %f\n",0.0/0.0);
return 0;
}
当浮点数超出可表示的范围,会有如下值。
No. | 输出 | 含义 |
---|---|---|
1 | inf |
表示正无穷大 |
2 | -inf |
表示负无穷大 |
3 | nan |
不存在 |
#include
int main(){
float f = 123456789.0;
double d = 123456789.0;
printf("f=%f\n" ,f);
printf("d=%lf\n",d);
return 0;
}
计算机浮点数存在精度问题。
No. | 类型 | 数字范围 | 有效数字 |
---|---|---|---|
1 | float |
-3.4E+38~3.4E+38 |
6~7 |
2 | double |
-1.7E-308~1.7E+308 |
15~16 |
3 | long double |
-1.2E-4932~1.2E+4932 |
18~19 |
注意:浮点类型没有无符号unsigned类型。
#include
int main(){
float a = 10.2;
float b = 9;
float c = a - b;
printf("%f - %f = %f\n", a,b,c);
return 0;
}
上面结果看似正确,把程序改成如下:
#include
int main(){
float a = 10.2;
float b = 9;
float c = a - b;
if(c == 1.2){
printf("%f == 1.2",c);
}else{
printf("%f != 1.2",c);
}
return 0;
}
以7位有效数组打印运算结果。
#include
int main(){
float a = 10.2;
float b = 9;
float c = a - b;
printf("%.7f - %.7f = %.7f\n", a,b,c);
return 0;
}
发现运算中存在精度缺失。
如何比较浮点数?使用最小误差。
#include
int main(){
float a = 10.2;
float b = 9;
float c = a - b;
if(fabs(c - 1.2) < 0.000001){
printf("%f == 1.2\n",c);
}else{
printf("%f != 1.2\n",c);
}
return 0;
}
在误差范围内认为相等。即绝对值差小于精度最小值。
float
浮点数误差通常为1-6(6位有效数字)。
double
浮点数误差通常为1-15(15位有效数字)。
浮点类型有三种,通常遵循下面的使用规则:
大多数情况下使用double
。
尽量不要使用float
。
过程运算可以使用long double
。
问题
#include
int main(){
printf("1/0 = %d\n",1/0);
return 0;
}
字符类型是一个特殊类型,是整型的一种。使用单引号表示字符字面量,例如:字母'a'
、数字'1'
、空字符' '
、转义字符\n
。
通常使用%c
作为格式化占位符输入输出,有时也可以使用%d
输出字符对应ASCII编码。
#include
int main(){
char n='1';
printf("%c\n%d\n",c,c);
return 0;
}
ASCII编码使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。
ASCII表的特点:
C语言中字符即数字。
printf("%d\n",'a');
printf("%c\n",97);
#include
int main(){
char a='a';
printf("%c\n%c\n",a,a+1);
return 0;
}
字符类型操作含义:
相减
,得到这两个字符在表中的距离。实例:
在ASCII表中,除了常见的字符(如:大小写字母、数字等),还包含一些无法打印出来的控制字符或特殊字符。这些字符以反斜线\
开头,后面接着一个字符,这种字符被称作转义字符或逃逸字符。
字符 | 含义 | 字符 | 含义 |
---|---|---|---|
\' |
单引号 | \" |
双引号 |
\r |
回车 | \n |
换行 |
\b |
退格符 | \f |
翻页符 |
\t |
表格符 | \\ |
反斜线符 |
在C99中新增bool
类型表示逻辑值,它只有两种值(true
和false
)。使用前需要加上头文件stdbool.h
。
当运算符左右两边操作数的类型不一致时,会自动转换成较大类型。
char
→short
→int
→long
→long long
int
→float
→double
→long double
当把一个较大的类型转换成较小的类型,需要强制转换。
强制转换语法
(转换后的类型)值
例如:
printf("%d\n",(int)3.14);
有时,整型转浮点型也需要强制转换。
例如:
printf("%f\n",(double)1/2);
其中,浮点数转整数采用的是截断方式。