1. 数据类型关键字
最初的数据类型关键字 | C90标准添加的数据类型关键字 | C99标准添加的数据类型关键字 |
---|---|---|
int | signed | _Bool |
long | void | _Complex |
short | _Imaginary | |
unsigned | ||
char | ||
float | ||
double |
2. 计算机的存储方式与C语言
在C语言中,int表示整数类型,char用于表示字符和较小的整数,float和double用于表示带小数点的数。long,short,unsigned和signed用于提供基本整数类型的变式,具体来说是对计算机提供更精准的描述,具体会单独再详细说明。_Bool表示布尔值(true和false),_Complex和_Imaginary分别表示复数和虚数。
根据关键字的类型,按计算机的存储方式可分为两大基本类型:整数类型和浮点数类型
计算机是以二进制的形式来存储数据
位、字节和字是描述计算机数据单元或存储单元的术语。
位、字节、字是计算机数据存储的单位。
位是最小的存储单位,每一个位存储一个1位的二进制码。
字节是常用的计算机存储单元,一个字节由8位组成。
字是设计计算机时给定的自然存储单元,根据设备的不同,字通常为16、32或64个位组成。
计算机的字长越大,其转移数据的速度越快,允许访问的内存也越多
3. 整数与浮点数
整数
在C语言中,整数就是没有小数部分的数。例如:2,-2,314都是整数。
浮点数
浮点数类似于实数。例如:3.00,0.22, 3.14E7 和 2e-8.
两种类型的区别
1.整数没有小数点部分,浮点数有小数点部分。
2.浮点数表示的范围通常比整数大。(浮点数通常占的位数会比整数多)
3.对于一些运算,浮点数会存在比整数更严重的精度丢失问题。
4.在实际情况中,浮点数表示的只是实际的近似值,并不是百分之百的精确值
5.过去,浮点数的运用会比整数运算慢,现在随着时代的进步,缩小了差距,几乎可以忽略不记。
关于几种基本数据类型的详细介绍
int类型
int类型是有符号整型,即int类型的值必须是整数,可以是正整数、负整数或0。其取值范围依计算机系统而异。早期是以16位来存储一个int值,如今int通常是32位。ISO(国际标准化组织) C规定int的取值范围最小为-32768~32767。C语言把大多数整形常量视为int类型,但是非常大的整数除外。
char类型
char类型用于存储字符(如,字母或标点符号),但从技术层面看,char是整数类型。因为char类型实际上储存的是整数而不是字符。计算机用数字编码来处理字符,即用特定的整数表示特定的字符。(例如常用的ASCII编码)
通常char类型被定义为8位的存储单元(足以容纳ASCII编码)。一般而言C语言会保证char类型足够大,以存储系统(实现C语言的系统)的基本字符集。
基于现在很多字符集都已经超过255,所以国际上也创建了很多新标准。
C语言把1字节定义为char类型占用的位(bit)数,因此不受操作系统位数的限制。
注意
使用char型时,单引号只能括住1个字符例如:
char a=‘A’;
而且中间不能含有中文等其他字符,例如下面的表示错误
‘aa’,‘12346’,‘枫’.
关于char有符号和无符号的问题
有些C编译器把char实现为有符号的类型,这意味着char可表示的范围是-128 ~ 127。而有些C编译器把char实现为无符号类型,那么可表示的范围是0 ~ 255
float类型和double类型
关于浮点数的计数法事例
数字 | 科学计数法 | 指数计数法 |
---|---|---|
1000 | 1.0 X 103 | 1.0e3 |
1230 | 1.23 X 103 | 1.23e3 |
123.45 | 1.2345 X 102 | 1.2345e2 |
0.0067 | 6.7 X 10-3 | 6.7e-3 |
float是单精度浮点型,double是双精度浮点型。double的精度比float高。
在C中为了区分float和double,float型数据需要以f结尾,例如
float a=1.23f;
float b=-2.1f;
float c=0.0f;
float d=1f,这里是需要注意的,只有小数才允许加上f,否则编译器会报错(具体类型是语法错误,错误的数字后缀)。
C标准规定,float必须至少是能表示6位有效数值,且取值范围至少是10-37~ 10+37。double和float类型的最小取值范围相同,但至少能表示10位有效数字,且一般情况下double占用64位而不是32位。
扩展:
通常系统储存一个浮点数要占用32位,其中8位用于表示指数的值和符号,剩下的用于表示非指数部分(也称为尾数或有效数字)
关于浮点数的上溢和下溢
上溢
当计算导致(或其他原因)数值过大,超过了当前类型所能表达的范围时,会发生上溢。在C语言中,对于这种情况,会用一个特定值表示无穷大。(整形常量若遇到超出表达范围是另外一种处理方法)
下溢
在浮点数的计算过程中, 损失了原末尾有效位上的数字,叫做下溢。
特殊的浮点值:NaN(not a number)
其他关键字
short、unsigned和long
C语言提供这三个关键字主要用于修饰基本整数类型(其他类型也会用到其中的一些)
short int:可简写为short,占用的存储空间(位数,如int通常为32位)可能比int少。与int 类似,为有符号类型。
long int:可简写为long,适用于较大数的环境。与int 类似,为有符号类型。
long long int:可简写为long long(C99标准加入),占用的储存空间可能比long 多,适用于更大数值的场合。至少占64位,与int 类似,为有符号类型。
unsigned:表示无符号类型,书写形式例如:unsigned int ,unsigned long int等,只适用于非负值场合。该类型的表示范围与有符号类型的表示范围不同,能表示更大的整数。
例如:
16位unsigned int表示的范围为0 ~ 65535,而16位int表示为 -32768 ~ 32767.
long double:C语言的第三种浮点类型,用来满足比double类型更高的精度要求。C只保证long double 类型至少与double类型相同,这点需要注意
_Bool
C99标准添加,用于表示布尔值,及逻辑上的true和false。C语言用非0值表示true,0表示false。但_Bool类型用值1表示true 值0表示false 。(在一定程度上反映了_Bool类型实际上也是一种整形)。布尔类型是无符号int类型,原则上只占用一位,所占用的空间只需能储存0或1即可。
_Complex和_Imaginary
出于科学和工程计算的原因,C99标准开始支持复数和虚数类型,但有所保留。一般而言,把虚数类型作为可选项。
C11则把复数软件包都作为可选项
C语言有3种复数类型:float_Complex,double_Complex和long double_Complex
使用时需注意,例如使用float_Complex类型的变量应该包含两个float类型的值,分别表示复数的实部和虚部.
类似地,C语言有3种虚数类型:float_Imaginary,double_Imaginary和long double_Imaginary,使用时类似于复数形式
特殊地
如果在编程时包含complex.h头文件,可用complex代替_Complex,用imaginary代替_Imaginary,一定情况需要时,还可以用I代替-1的平方根。