前言
什么是数据类型呢?顾名思义应该是数据的种类,例如年份、年龄这些都会用整数来表示,问到这些我们不会用比如:2024.5年、20.85岁这样的数值来表示;然而像温度、身高体重这些的表示又会用到小数来表示。我们观察这些数据可以发现他们都会有独有的特征,整数只有数字,小数呢都会有一个小数点等等。那么C语言中的数据类型又是啥样的?下面我们来一块看看!
一.C语言中的数据类型
以上图片里看到的就是C语言所提供的各种数据类型
二.内置类型
1.字符型
C语言里字符型用(char)来表示,分为 [signed]char (用[ ]阔起来的可以省略不写) 和 unsigned char;[signed]char表示有符号字符型、unsigned char表示无符号字符型。既然 [signed]char 可以写成char,那么 [signed]char 就等于char吗?答案是:可能是的,他们是否相等取决于所用的编译器!
2.整形
在C语言里整形又被分成哪些呢?
整形分成了:
>短整形: short[int]、有符号的短整形[signed]short[int]、无符号的短整形 unsigned short[int]
>整形: int、有符号的整形[signed]int、无符号的整形unsigned int
>长整形: long [int]、有符号的长整形[signed]long[int]、无符号的长整形unsigned long[int]
>更长的整形(在C99标准中引入):long long [int]、有符号的更长整形[signed]long long[int]、无符号的更长整形unsigned long long[int]
同样[ ]中的内容可以省略不写,那么这些中的[signed]short[int]和short、[signed]int和int、[signed]long[int]和long、[signed]long long[int]和long long,是否相等呢?答案是:是的,不加signed会默认是有符号型的。
3.布尔类型
布尔类型(_Bool)是在C99标准中引入的,专门用来表示真假;在此之前C语言是用0表示假,非0表示真。
布尔类型的使用需要包含头文件<stdbool.h>
布尔类型变量的取值是:ture(真)或者false(假)
通过查看stdbool.h这个头文件我们可以更直观的看到!
下面我们通过代码演示来看看:
if( )语句括号内的表达式为真则执行语句,为假则会跳过语句。flag初始化为false时未打印内容,说明flag为假;也能说明false为假。
4.浮点型
在C语言中浮点型分为单精度浮点型(float)和双精度浮点型(double)、长的双精度浮点型(long double),double型的浮点数的精度更高;但是在浮点数在计算机中都不能精确保存!
三.自定义类型
1.数组
什么是数组呢?数组是一种相同类型元素的集合,由此我们可以发现一个数组中的元素至少都会大于等于1个,并且它们都必须是相同类型的。数组又分为一维数组和多维数组,其中一维数组和二维数组较为常用。
下面举例出一些数组:
int arr[10]、char ch[5]、float score[20]、double arr1[15] 、int coordindate[10][10]......
那这些数组的类型又是什么呢?其实把他们的数组名去掉就是他们的类型
> int arr[10] 的类型为:int [10]
> char ch[5]的类型为:char [5]
> float score[20]的类型为:float [20]
> double arr1[15]的类型为:double [15]
> int coordindate[10][10]的类型为:int [10][10]
2.结构体
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量;说到结构体还得要说C语言中的一个关键字“struct",需要创建结构体就需要用到这个关键字。那么结构体又是用来干什么的呢?我们以一个现实生活中的例子来说,我们要描述一个学生的信息一般需要描述姓名、性别、年龄等等;可以发现这些信息并不都是同一个类型的,那么我们该怎样来储存它们呢?结构体便能满足我们的需求!
例如:
我们可以看到用结构体struct student创建的变量s可以满足我们要保存学生信息的需求,那么这个结构体的类型又是什么呢?我们是用数据类型来创建变量的,那么这个struct student就应该是这个结构体的类型。
由此我们可以推断是不是结构体的类型都是struct开头的呢?好像没什么问题,不过有点麻烦每次拿起结构体创建变量都要写这个struct;这里我们在来看另外一个关键字“typedef”:
typedef是类型重命名的意思,我们可以用这个关键字把上面struct student的类型名重新命名成student,这样我们拿起结构体创建变量的时候就会变的方便一些。利用typedef这个关键字我就可以把一些较长的结构体类型名重新命名成简短的,就能解决上面说的麻烦的问题。
3.枚举
什么是枚举呢?顾名思义应该是一个一个的列举出来,这里又会专门用到一个关键字“enum”。
上面定义的 enum months 、enum color 这些都是枚举类型。
4.联合体
联合体类似于结构体,也是由⼀个或者多个成员构成,这些成员可以不同的类型;但是编译器只为联合体的最⼤的成员分配⾜够的内存空间,所以联合体所有成员共⽤同⼀块内存空间,也称为共用体。联合体使用关键字“union”
上面定义的 union Un1、union Un2,都是联合体的类型。
四.整形家族和浮点型家族
什么是整形家族呢?什么又是浮点型家族呢?字面意思看已经能告诉我们大部分信息了,浮点型家族应该就是包括浮点型吧!确实C语言中把float型、double型、long double型归为浮点型家族。那这样整形家族肯定就是整形了吧!那么真的是这样的吗?答案是:不够完整,C语言中把字符型、整形、布尔类型都归为整形家族。
下面我们来了解一下为什么,我们用一段代码来看看:
既然它们都是整形家族里的,那我们就用打印整形的%d来打印它们,我们发现打印出来的结果居然都是整数!这是为什么呢?原来字符是以ASCII码值储存在计算机中的,而布尔类型里的true和false分别被定义为了1和0;它们都是整数所以才将它们都到整形家族里面。
(关于ASCII码有专门的表格,感兴趣可以查看https://zh.cppreference.com/w/cpp/language/ascii)
五.内置数据类型的长度及取值范围
说到长度这里又得提到一个关键字“sizeof”,同时它也是一个操作符;专⻔是⽤来计算sizeof的操作符数的类型⻓度的,单位是字节。它的操作数可以是类型、变量或者表达式。下面我们一块来看看
(在vs2022 x86配置下的输出)
我们可以看到各个数据类型的长度分别为:
char :1字节; short :2字节; int : 4字节; long :4字节; long long :8字节;
float :4字节; double :8字节; long double :8字节; bool :1字节
这些类型的取值范围分别又是多少呢?通过查看limits.h、float.h这两个头文件我们便可以看到这些类型的取值范围
>字符型:
>整形:
>浮点型:
我们在知道了内置各种类型的取值范围后,能够更好的帮助我们根据不同场景的需求来合适的选择C语言为我们提供的这些内置类型。
结语
本次的探究就到这里啦,非常感谢您能够看到最后;本人是C语言的初学者如果上面有说到不对的地方还请大家指正,以免误导别人。如果此文章对您有些许帮助,本人荣幸至极!再次感谢您的阅读!