【C语言】数据类型和变量


前言

一、数据类型分类(内置数据类型:字符型、整型、浮点型和布尔类型)(自定义数据类型:数组、结构体、枚举和联合体)
二~三、深入研究内置数据类型(内置数据类型的大小、使用内置数据类型创建变量、signed 和 unsigned)
四、自定义数据类型的内容过于庞大,所以每种自定义数据类型都专门写了一篇博客来介绍,文中有相应链接。


一、数据类型分类

C语言提供了丰富的数据类型来描述生活中的各种数据。
使用整数类型来描述整数,使用字符类型来描述字符,使用浮点数类型来描述小数。
所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。

下面盘点一下C语言提供的各种数据类型:
在这里插入图片描述

二、内置数据类型

1.字符型

字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。在键盘上可以敲出各种字符,如:a,5,+,#等,这些符号都被称为字符,C语言中字符是用单引号括起来的,如:‘a’,‘5’,‘+’,‘#’。

字符类型的表示如下:

char
signed char //有符号的
unsigned char //无符号的

2.整型

整型就是用来描述整数的数据类型。

整数类型的表示如下(“[ ]括号里的内容”表示是可以省略的内容):

(1)短整型
short [int]
[signed] short [int]
unsigned short [int]
(2)整型
int
[signed] int
unsigned int
(3)长整型
long [int]
[signed] long [int]
unsigned long [int]
(4)更长的整型(C99中引入)
long long [int]
[signed] long long [int]
unsigned long long [int]

3.浮点型

浮点型就是用来描述小数的数据类型。

浮点数类型的表示如下:

float //单精度浮点型
double //双精度浮点型
long double

4.布尔类型

C 语言原来并没有为布尔值单独设置⼀个类型,而是使用整数 0 表示假,非零值表示真。
在 C99标准 中才引入布尔类型 ,它是专门表示真假的。

布尔类型的表示如下:

_Bool

布尔类型的使用得包含头文件 <stdbool.h>
布尔类型变量的取值是: true 或者 false .

#define bool _Bool
#define false 0
#define true 1

//以上是头文件 <stdbool.h>中的部分内容

布尔类型的使用示例如下:

#include <stdio.h>
#include  <stdbool.h>

int main()
{
	_Bool flag = true;//等同于:bool flag = true;
	if (flag)
		printf("i like wukong\n");

	return 0;
}

在这里插入图片描述

三、深入研究内置数据类型

1.内置数据类型的大小

每⼀种数据类型都有自己的大小,使用不同的数据类型,能够创建出大小不同的变量,变量大小的不同,存储的数据范围就有所差异。我们可以使用操作符sizeof来求出不同数据类型所占用的内存大小。

sizeof 是⼀个专门用来计算数据类型大小的操作符,单位是字节。
sizeof 操作符的操作数可以是类型,也可是变量(计算变量的类型的长度)或者表达式(计算表达式结果的类型长度),形式如下:

sizeof( 类型 )
sizeof(表达式)
sizeof 表达式
sizeof(变量)
sizeof 变量

注:sizeof 的操作数如果不是类型,是表达式或者变量的时候,是可以省略掉后边的括号的。但由于操作符优先级的缘故,有些时候省略掉sizeof后面表达式的括号,可能就会出现问题。

sizeof 的计算结果是 size_t 类型的。
注:size_t 类型是一种无符号整数类型,但它在不同的系统上的定义可能不太一样,size_t在32位系统上定义为 unsigned int,在64位系统上定义为 unsigned long。我们一般使用 %zd格式 来打印size_t类型的数据。

使用 sizeof操作符计算内置数据类型的大小,示例如下:

#include <stdio.h>
int main()
{
 printf("%zd\n", sizeof(char));
 printf("%zd\n", sizeof(_Bool));
 printf("%zd\n", sizeof(short));
 printf("%zd\n", sizeof(int));
 printf("%zd\n", sizeof(long));
 printf("%zd\n", sizeof(long long));
 printf("%zd\n", sizeof(float));
 printf("%zd\n", sizeof(double));
 printf("%zd\n", sizeof(long double));
 return 0;
}

在VS2022 X64配置下的输出:
在这里插入图片描述
从sizeof操作符计算出来的结果中可以看出短整型short(2字节),整型int(4字节)和更长的整型long long(8字节)在内存中所占用的大小是不一样的。

为什么都是用来表达整数的数据类型要划分出这么多种长度不同的数据类型呢?
几种整数类型的长度不一样,所表达的整数范围就不一样。短整型short所表达的整数范围比较小,整型int所表达的整数范围适中,更长的整型所表达的整数范围最大。
如果我们只有int一种整数类型,那么我们用int定义一个变量,然后使用这个变量去存储一个较小的整数,这时我们就会发现内存空间被浪费;但如果使用这个变量去存储一个很大的整数,又发现它存不下。
所以为什么会存在这么多种整数类型的答案逐渐清晰,为了方便程序员根据不同的整数大小灵活创建不同类型的整型变量,为了使内存空间得到充分利用。

2.signed 和 unsigned

C 语言使用 signed 和 unsigned 关键字修饰 字符和整数 类型的。
signed 关键字,表示⼀个类型带有正负号,包含负值;
unsigned 关键字,表示该类型不带有正负号,只能表示零和正整数。

对于 int 类型,默认是带有正负号的,也就是说 int 等同于 signed int 。由于这是默认情况,所以关键字 signed 一般都省略不写。

signed int a;
// 等同于int a;

int 类型也可以不带正负号,只表示非负整数。这时就必须使用关键字 unsigned 声明变量。

unsigned int a;

unsigned int 里面的 int 可以省略,所以上面的变量声明也可以写成下面这样。

unsigned a;

整数变量声明为 unsigned 的好处是,同样大小的内存能够表示的最大整数值,增大了一倍。
比如,16位的 signed short int 的取值范围是:-32768~32767,最大是32767;而unsigned short int 的取值范围是:0~65535,最大值增大到了65535。

字符类型 char 也可以设置 signed 和 unsigned 。

signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255

注:C 语言规定 char 类型默认是否带有正负号,由当前系统决定。
这就是说, char 不等同于 signed char ,它有可能是 signed char ,也有可能是unsigned char 。(这一点与 int 不同, int 就是等同于 signed int )

3.使用内置数据类型创建变量

了解清楚了内置数据类型,我们使用这些类型做什么呢?类型是用来创建变量的。
什么是变量呢?C语言中把经常变化的值称为变量,不变的值称为常量。
变量创建的语法形式是这样的:

data_type name;
//数据类型 + 变量名

补充:变量名的命名规则
(1)变量名只能由字母、数字和下划线组成。
(2)变量名不能以数字开头,第一个字符必须是字母或下划线。
(3)变量名区分大小写,因此"test"和"Test"被视为两个不同的变量名。
(4)变量名不能是C语言中的关键字,如break、case、char、int、float等。

int age;//整型变量
char ch;//字符变量
double weight; //浮点型变量

变量在创建的时候就给⼀个初始值,就叫初始化。

int age = -18;
char ch = ‘c’;
double weight = 3.14;
unsigned int height = 100;

四、自定义数据类型

自定义数据类型的内容过于庞大,所以每种自定义数据类型都专门写了一篇博客来介绍,下面附上对应链接。

1.数组

【C语言】详解数组 的链接: link

2.结构体

【C语言】自定义类型:结构体 的链接: link

3.枚举和联合体

【C语言】自定义类型:联合和枚举 的链接: link


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值