数据

什么是数据?

数据是所有能输入计算机并被计算机程序处理的符号介质的总称

为什么要存储数据?

程序是由指令和数据组成的。在程序的指导下,计算机可以做许多事情,如数值计算、名字排序、执行语言或视频命令、计算彗星轨道、准备邮件列表、拨电话号码、画画、做决策或其他你能想到的事情。
要完成这些任务,就需要存储需要处理的信息。

如何存储数据?

为了把信息存储在计算机中,必须记录 3 个基本属性:

  • 信息存储在哪里?
  • 存储什么类型的信息?
  • 存储什么值?

在 C 语言中,我们可以通过声明一个变量来实现存储信息,例如:

  1. int bra;
  2. bra = 5;

这些语句告诉程序,正在存储整数,存储的整数值为 5,使用名称 bra 来表示该整数值(这里为 5)。实际上,程序在内存中找到一块能够存储整数的内存,将该内存单元标记为 bra,并将 5 复制到这个内存单元中;然后,可以在代码中使用 bra 来访问该内存单元。虽然这些语句并没有明确表明这个值应该存储在内存的什么位置,但程序确实记录了这种信息。事实上,可以通过 & 运算符来检索 bra 的地址。

数据类型

1630549282063-2041cd27-c5c4-4bf2-a967-ace60fc5b72f.png

基本类型

这是我们今天的主角,在 C 语言的基本数据类型中有整型、浮点型、字符类型。在学习基本数据类型时,我们需要关注这些类型的关键字,占多少字节,取值范围。

整型

什么是整型?所谓整型,即没有小数的数。它又包括正整数、0、负整数,同样我们的整型数据有正有负,也有0。C 语言提供了多种整数类型,程序员针对不同情况可以选择不同类型,一般情况使用 int 类型即可,但是为满足特定任务和机器要求,可以选择其他类型。

整型 int

内存大小:C 语言规定,int 类型最少占 2 字节,最多不超过 long。对于 16 位编译器来说,int 是 2 字节,对于 32 位和 64 位编译器来说,int 是 4 字节。因为目前常用的是 32 位和 64 位编译器,因此一般来说 int 的范围是 [-2^31, 2^31-1],即 [-2147483648, 2147483647]。

短整型 short

内存大小:C 语言规定,short 类型最少占 2 字节,最多不超过 int。对于 16 位、32 位、64 位编译器来说,short 类型都是占 2 字节,取值范围是 [-2^15, 2^15 -1],即 [-32768, 32767]。

长整型 long

内存大小:C 语言规定,long 类型最少占 4 字节。对于 16 位、32 位编译器来说,long 占 4 字节,对于 64 位编译器来说,long 占 64 位。
由于 long 类型在常用的 32 位和 64 位编译器中存储的字节数不同,因此引入 long long 类型,long long 至少占 8 字节。
不同位数的编译器,整型数据所占字节数如下所示。

数据类型\编译器位数 16 32 64
short 2 2 2
int 2 4 4
long 4 4 8
long long 8 8 8

为什么要使用多种整型?

首先,我们来看看整型和我们平常所说的整数有什么差别?
平常所说的整数是无限的,而整型是存储在计算机中的整数,它是有限的,是受限于计算机的存储单元的。之所以使用多种整型,正是因为这些整型由于存储时占据的字节数不同,使得它们的取值范围不同。这样我们就可以根据需要存储的数据的范围来选择使用的整型。

浮点型

什么是浮点型?所谓浮点型,即有小数的数。是因为小数点的位置可以自由浮动,因此称为浮点数。例如,1.234 和 12.34,虽然他们在大小上一致,但是在存储时有所不同。浮点型有单精度浮点数和双精度浮点数两种,所谓精度指的是能精确表示的有效数字,注意不是小数点后有效数字!!!。

单精度浮点数 float

内存大小:占 4 字节。至少能精确表示6位有效数字。最高位为符号位,紧接着8位为指数位,剩下的23位为尾数位。

双精度浮点数 double

内存大小:占 8 字节。至少能精确10位有效数字。最高位为符号位,紧接着8位为指数位,剩下的52位为尾数位。

字符型 char

内存大小:占 1 字节。其本质上是 1 字节的整型。大部分编译器默认 char 类型是有符号的,不过我们常用的是 [0,127] 这一部分,实际上其取值范围是 [-128,127]。

构造类型

有的数据比较复杂,我们可能会用到结构、数组等数据形式来表示。

指针类型

C 语言的重点内容就是指针和内存管理,所以这一部分呢很重要,在后面的学习中有一章专门讲解。

变量

变量这个名词来源于数学,在计算机语言中变量是储存计算结果或能表示值的抽象概念,变量可以通过变量名访问存储的值。也就是说,在 C 语言中,可以用变量来存储数据。
变量是一种使用方便的占位符,用于引用计算机内存地址。使用变量时并不需要了解变量在计算机内存中的地址,只要通过变量名引用变量就可以查看或更改变量的值。
变量其实有很多需要学习的知识,包括命名规则、变量类型、类型转换、存储类型等,这里我们先学习较为简单的变量命名,其他部分之后再进行学习。

变量命名

为什么要命名?

首先,对于计算机来说,没有命名不命名的,只有0和1。数据保存在内存中,程序使用数据时,需要知道该数据在内存中的地址,才能使用,而地址是由一系列的0、1组成。
之所以要有命名是因为直接使用内存地址的话,不光使用的时候非常麻烦,而且阅读代码的时候也十分难以阅读。
C 语言的命名提供了一个机制,我们为使用的内存地址命了一个名,之后使用这个名字,程序会根据这个名字找到对应的内存地址,使用该数据。
另外为了便于日后代码的阅读性,要求命名时要使用有意义的变量名或标识符。如果变量名无法清楚地表达自身的用途,可以在注释中进一步说明。

结论:命名是为了我们编写和阅读代码方便而引入的,为了便于代码阅读,推荐命名时使用有意义的变量名或者标识符。

命名规则

  1. 可以用英文字母、数字、下划线(_) 来命名。
  2. 英文字母区分大小写。例如,num、Num、NuM、NUM 是不同的。
  3. 首字母不能是数字。
  4. 不能使用 C 语言的关键字和保留标识符。

PS:Java 的命名规则中还可以用美元符号($)来命名,但是 C/C++ 不可以。

关键字

关键字是 C 语言中事先被定义了某些用途的词汇。有的用于指定不同的数据类型,例如,int。有的用于控制程序中语句的执行顺序,例如,if。这些我们都会在后面的学习中遇到。

分类 关键字
数据类型 char、short、int、long、float、double、unsigned、constvoid
流程控制 if、else、for、while、do…while、switch、case、default、continue、break、return、goto
存储类别 static、auto、register、volatile
其他数据形式 struct、union、enum
其他 inline、extern、restrict、sizeof
C11 新增 _Alignas、_Alignof、_Atomic、_Bool、_Complex、_Generic、_Imaginary、_Noreturn、_Static_assert、_Thread_local

变量的声明和初始化

变量需要先进行声明,之后才能使用变量。下面,我们声明一个 int 类型的变量,并让其存储值 5。

  1. int arb; // 声明变量
  2. arb = 5; // 存储值 5

上面的两条语句可以合并为一条初始化语句:

int arb = 5; // 在声明变量的同时赋值的语句称为初始化语句

变量和常量

有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些称为常量(constant)。其他数据类型在程序运行期间可能会改变或被赋值,这些称为变量(variable)。