计算机组成

硬盘,内存条,cpu,拿我们播放一个电影为例,先把电影从硬盘中拿出,拿到内存条中,cpu去处理内存条中的数据,根据处理结果去选择显卡和声卡处理。

硬盘,内存条,cpu,显卡,声卡等等都是插在主板上的。

操作系统

现代的操作系统不允许直接访问硬件,只允许访问操作系统暴露出来的接口。

数据类型

  • 基本数据类型
  • 复合数据类型

image.png

short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型。构造类型就是把基本类型以某种方式结合起来。

数据类型是由编译器创建的,为了更好的管理内存空间,数据类型是对数据的抽象,对整数抽象成 int ,类型相同的数据有相同的表现形式,存储格式以及相关操作。程序中所有的数据必然属于某种数据类型,数据类型可以理解为创建数据的模具。

语言类型

c 语言是弱类型,静态类型的语言,通常我们说,X语言是用Y语言写的,其实是X语言的编译器是用Y语言实现的。所以第一个 c 语言编译器是由 b 语言写的,之后 c 语言的编译器都是由 c 语言写的。

C语言要领

不要揣测编译器的行为,更不要轻易给编译器的行为下普遍性的定论。

程序员为主

  1. #include <stdio.h>
  2. int main(){
  3. int i = 10.7
  4. }

程序不会报错而是会有一个警告,c 语言设计思想就是相信程序员,觉得第三行的代码程序员有自己的想法,i 最后等于 10 ,这也体现了弱类型。

什么是变量

  1. #include <stdio.h>
  2. int main(){
  3. int i
  4. }

编译器会在内存中划出一段空间,并且与 i 产生联系,i 所在的内存就是我们所说的变量,i 这个字母就是变量名,变量名指代了这块内存。

变量:用来标识(identify)一块内存区域,这块区域的值一般是可以更改的,这就是它“变”的由来,但是我们可以通过使用如const等一些修饰符号来限定这一内存区域的操作特性(characteristic),即变量的操作特性。用const修饰的使变量不能更改的就和常量一样的变量叫做常变量。

变量名:是一个标识符(identifier),用来指代一块内存区域,即变量,使用变量使我们操作内存以区域(area),以块(block)为单位,提高了方便性。

变量的赋值

  • 数据对象: 赋值表达式是把值存储到内存位置,用来存储值的数据存储区域称为数据对象,在C语言中只有提到这个概念才会用到对象这个术语,通常使用变量名来标识对象也可以使用数组的元素来标识。

  • 左值: 是数据对象的名称或者表达式。

因此,对象是实际的数据存储,而左值是用于标识和定位存储位置的标签。

变量名不占用内存

在汇编年代,没有变量名,我们操作内存,都是用地址来直接操作的,对于编译器,它会搜集我们的变量名。

  1. int a

编译器分配4个字节内存,并把我们的变量名“a”保存进符号表,并命名该4个字节的空间名字为a,所以符号表的索引对应实际的空间。

  1. b = a

编译器就会根据符号表找到变量的真正的物理位置,取得它的值,赋给b。这是写编译器需要做的,需要建立符号表。

变量名是给编译器看的,编译器根据变量是局部还是全局分配内存地址或栈空间,所谓的变量名在内存中不存在,操作时转换成地址数存放在寄存器中了。编译器会将合法的变量名放到一个叫“符号表”的一个表中。每个符号对应一个地址。当你调用此变量时,就会根据此符号表找到对应的地址,然后进行操作。

变量初始化

  1. #include <stdio.h>
  2. int main(){
  3. char name;
  4. printf("%s",name);
  5. }

name 标识符指向了一块内存,但是该内存没有赋值,所以输出的是一个任意可能的数据。但是编译器做出了一些处理把这些没有赋值的变量统一赋值了一个值,它可能为一串长数字,或者为“null”,这根据编译器来决定。这是为了防止如果废弃数据恰好长得像正常数据,那么会被程序员误用。

C语言常量表示

整数

  • 八进制:前面加 0
  • 十六进制:前面加 0x 或者 0X
  • 十进制:正常

浮点数

  • 正常表示:x = 3.2
  • 科学计数法:x = 3.2e-2

字符

  • 单个字符用单引号,字符串用双引号。

二进制表示

  • 整数:补码

  • 实数:IEEE754

  • 字符:ASCLL码转为整数再转为补码

一串二进制数可能对应上面三种情况,看如何解析

最小的存储单位

计算机最小的存储单位是位,但是 cpu 能控制到的最小单位是字节(因为寄存器是8个叠起来的),控制位得靠位运算符来运算。

字 字长

字(word)计算机进行数据处理时,一次存取、加工和传送的数据长度称为字(word)。一个字通常由一个或多个(一般是字节的整数位)字节构成, 字长 计算机的每个字所包含的位数称为字长,一般 int 的长度就是一个字长。

C 的标准

  • C89(ANSI C), C90 三个现在指的是一个标准, C90 是补丁

  • C99 增加了很多新的内容,是比较重要的 C 标准

  • C11 标准新引入的特征尽管没 C99 相对 C90 引入的那么多,但是这些也都十分有用,比如:字节对齐说明符、泛型机制(generic selection)、对多线程的支持、静态断言、原子操作以及对 Unicode 的支持。C17 没有引入新的语言特性,只对 C11 进行了补充和修正。