(1) C语言基础知识:数据类型和变量
C语言是一种基础的程序设计语言,被广泛应用于各种软件和系统的开发。在学习C语言编程之前,我们需要先了解C语言的数据类型和变量。
数据类型¶
C语言支持多种基本数据类型,包括整型、浮点型、字符型和布尔型等。这些数据类型的具体定义和取值范围在不同的编译器和操作系统上可能会有所差异,但它们的基本概念是相同的。
整型¶
整型是C语言中最基本的数据类型之一,它表示整数值。在C语言中,整型可以分为有符号整型和无符号整型两种类型。有符号整型可以表示 负数和正数 ,而无符号整型只能表示 非负数 。
C语言中常用的整型数据类型包括:
char
: 一个字节大小的有符号整数,通常用来表示字符。short
: 两个字节大小的有符号整数。int
: 通常为四个字节大小的有符号整数,是C语言中最常用的整型类型。long
: 通常为八个字节大小的有符号整数,可用于表示比int更大的整数值。unsigned char
: 一个字节大小的无符号整数,表示非负数。unsigned short
: 两个字节大小的无符号整数,表示非负数。unsigned int
: 四个字节大小的无符号整数,表示非负数。unsigned long
: 八个字节大小的无符号整数,表示非负数。
什么叫做字节?¶
为了方便陈述,这里我们把“1字节”理解为空间的基础单位,比如“1立方厘米”;为了更好的将字节拟物化,我们将内存类比为瓶子,那么“1字节”的内存空间就等效于“1立方厘米”的瓶子,即:
为了方便描述,我们将“1立方厘米的瓶子”直接简称为“1瓶子”,那么关于上面的类型对应的描述就好理解了:
char
: 1瓶子short
: 2瓶子int
: 4瓶子long
: 8瓶子unsigned char
:1瓶子unsigned short
: 2瓶子unsigned int
: 4瓶子unsigned long
: 8瓶子
接着我们再来引入另一个单位bit
,它是计算机的计算大小的最小单位,且有如下关系:
这意思就很明显,它表达的意思就是,每个bit
的空间是 \(\frac1{8}\)瓶子。那么1bit
的空间可以装什么东西呢?一颗苹果还是一颗鸡蛋?
有意思的是它只装一个“开关”,我们都知道开关就只有“关”和“开”两个动作,而计算机是数字的世界,因此它是用0和1来表达开关的,即:
0
:代表关1
:代表开
所以我们说它只能装一个开关。那么聪明的小伙伴应该想到了,可是上面提到了整形,整形应该是类似123456的值,而不是开关啊。没错,接着我们就要展示魔法的力量了,怎么样把开关变成数字,我们拿char
举例:
- 开始讲述前,我先跟大家说一下,char的整数范围在:“-128 ~ 127”
-
前文我们已经知道,1个
char
等于1个瓶子,等于8bit
,等于8个“开关”的组合,等于8个0
或1
的组合,即:b7 b6 b5 b4 b3 b2 b1 b0
- 从左往右依次变小,这里的
b0
指的是“第0bit
”,以此类推b7
就是“第7bit
”也是最高位(C语言默认是从0开始,而不是我们通常的1); - 其中,最高位
b7
表示的是 符号,即+
或-
。当b7
为0
时,代表+
(正数),反之为-
(负数); -
当
b7
为0时(即正数),有个对应的计算值公式:\[ \sum_{0 \le i < 7}b_i \times 2^{i} = b_0 2^0 + b_1 2^1 + b_2 2^2 + b_3 2^3 + b_4 2^4 + b_5 2^5 + b_6 2^6 \]非负数运算
0 0 0 0 1 1 0 1
- b7为0,因此是正数
- 计算值:
\[ \begin{align} &= 1 \times 2^0 + 0 \times 2^1 + 1 \times 2^2 + 1 \times 2^3 + 0 \times 2^4 + 0 \times 2^5 + 0 \times 2^6 \\ &= 1 + 4 + 8 \\ &= 13 \end{align} \]
- 从左往右依次变小,这里的
-
这样的话我们就能知道1瓶子(即1
char
)里面代表的整数值是多少了,那么在“1”中提到的最大值127
的表达方式就是:0 1 1 1 1 1 1 1
,即符号为+
,值全为1
(这下你应该能想象出来了吧,一个char
的瓶子里,如果是127
,那么它里面装了7个1
和1个0
)。 - 关于负数涉及别的知识点,影响大家学习本篇内容,下篇咱们再做扩展。
有符号和无符号的区别¶
这个很简单,就是最高位代表的是 符号 还是 值,我们拿char
和unsigned char
举例。
从前文中我们知道,char
和unsigned char
都是1瓶子,因此他们都是8bit
,最高位都是b7
,但对b7
的解释不同:
- 对于
char
来说:b7
是符号位,代表的是+
或则-
; -
对于
unsigned char
来说:它没有负数值,因此b7
也是值的一部分,因此公式改为:\[ \sum_{0 \le i \le 7}b_i \times 2^{i} = b_0 2^0 + b_1 2^1 + b_2 2^2 + b_3 2^3 + b_4 2^4 + b_5 2^5 + b_6 2^6 + b_7 2^7 \]- 因此
unsigned char
多出了个 \(b_7 2^7\) 的值,所以它的取值范围变为“0 ~ 255”(将负数值加到正数中:\(127 + 128\))
- 因此
浮点型¶
浮点型是C语言中表示 实数值 的数据类型。C语言支持两种浮点型数据类型,分别为float
和double
。float
通常为四个字节大小,double
通常为八个字节大小。
是不是忘记什么叫做 实数值 了?这里大家可以不用管具体定义,直接理解为“整数” + “小数”即可,比如:136
、136.2
、136.0
。
聪明的小伙伴又发现了,既然它能表达整数的话那直接用它不就行了吗,也没必要用整型数了。这个非常有道理,但是本着存在即合理的原则,大家肯定也是有点疑虑的,这里简单的为大家答疑下,他们的几点不同:
-
需要的硬件不同:
- 浮点计算需要特殊的浮点运算硬件
-
空间不同:
- C语言面临的都是系统级别的开发,因此对于内存和性能相对于软件来说有较高的要求,因此在不同的空间需求下面会有针对性的使用,哪怕他也能表达“-128 ~ 127”,但是如果需求只落在这个范围内,C程序员也更乐意去使用
char
类型,而不是float
类型,但从空间上看一个是“1瓶子”一个是“4瓶子”。
- C语言面临的都是系统级别的开发,因此对于内存和性能相对于软件来说有较高的要求,因此在不同的空间需求下面会有针对性的使用,哪怕他也能表达“-128 ~ 127”,但是如果需求只落在这个范围内,C程序员也更乐意去使用
-
范围不同:
- 4瓶子的
float
表达的范围是“±1.1754944 × 10^-38
到±3.4028235 × 10^38
”
- 4瓶子的
字符型¶
字符型数据类型表示单个字符。在C语言中,字符型数据类型为char
类型,它通常为一个字节大小,可表示256种不同的字符。
这里的字符你可以理解为就是你平时看到的 符号和字母,比如:A ~ Z
、a ~ z
、@
、!
等
布尔型¶
布尔型数据类型只有两个可能的取值:true
或false
。在C语言中,布尔型数据类型为_Bool
类型,它通常为一个字节大小。
一般用在“是否”、“对错”、“开关”等一对互斥关系的表达中。
变量¶
变量是指在程序中用于存储数据的一块内存空间。在C语言中,每个变量都必须先定义才能使用。变量的定义包括变量的数据类型和变量名两个部分。
C语言中变量的命名规则比较灵活,变量名可以由字母、数字和下划线组成,但不能以数字开头。变量名大小写敏感,也不能与C语言的关键字重复。
变量的定义通常在函数体之前进行。变量的定义格式为:数据类型 变量名;例如:
这里结合上面的瓶子,可以理解为瓶子“贴标签或命名”,比如:
int a
表达的就是生成了一个 4字节大小的瓶子 且该瓶子专门用来放 整数,它被贴了标签a
,后续就可以直接用a
来表示这个整数瓶子。-
float b
表达觉得就是生成了一个 4字节大小的瓶子 且该瓶子专门用来放 实数值 ,它被贴了标签b
,后续就可以直接用b
来表示这个实数瓶子了。 -
我们将这样的行为称之为“定义变量”(生成一个有名字的,特定类型的瓶子)
当然,我们也可以在生成瓶子的同时,直接给瓶子装一些 初始内容 (初始值)例如:
int a = 10
的意思就是:生成了一个 4字节的整数瓶子,并且在生成的同时给它放进去了10
这个值。- 我们将这样的行为称之为“初始化变量”
既然它是瓶子,那它里面装的内容肯定可以改变,比如开始放的是“苹果”,那后来换颗梨进去肯定没毛病把? 因此:
-
a = 20
意思就是,把 a瓶子 里的内容换成20
-
我们把这样的行为称之为“赋值变量”(变量的值可以随时被改变,通过赋值运算符“
=
”来改变变量的值)
除了基本数据类型之外,C语言还支持结构体、枚举、指针等高级数据类型。这些数据类型可以更灵活地组织和操作数据,但需要更深入的学习和理解。
总结¶
本篇文章介绍了C语言的基本数据类型和变量的概念,加入了对字节的解释和正整数值的运算。了解数据类型和变量是学习C语言编程的第一步,也是编写高质量程序的基础。在后续的文章中,我们将继续介绍C语言的各种语法和特性,帮助读者更好地掌握C语言编程。