- 硬件系统
- 主机
- 中央处理器(CPU)
- 寄存器
- 运算器
- 控制器
- 内存储器
- 随机存储器(RAM)
- 只读存储器(ROM)
- 中央处理器(CPU)
- 外部设备(外设)
- 输入设备:鼠标、键盘、摄像头等
- 输出设备:声卡、显卡等
- 外存储器:光盘、硬盘、U盘等
- 主机
- 软件系统
- 系统软件
- 操作系统
- 语言处理系统
- 数据库管理系统
- 系统服务程序
- 应用软件
- 系统软件
数据计算时的存储变化
- 内存储器
采用电信号存储数据,速度快,但是断点数据丢失
- 外存储器
如光盘,采用磁信号存储数据,速度慢,但是可以用来做数据持久化
寄存器 几个概念如一个磁盘中的数据:
磁盘 > 磁盘缓存 > 内存 > CPU缓存 > 寄存器 > 运算
寄存器名称
- 寄存器是CPU内部的最基本的存储单元
- CPU通过总线(数据、地址、控制)来和外部设备打交道
- 如果CPU的总线是8位,寄存器也是8位,则这就是个8位的CPU;倘若总线16位,寄存器32位,那么则是一个准32位CPU
- 在64位的CPU上运行64位的操作系统,则这是个64位的操作系统,若运行的是32位的操作系统,则这是个32位的操作系统
- 64位的软件不能运行在32位的CPU上
| 8位CPU | 16位CPU | 32位CPU | 64位CPU |
|---|---|---|---|
| A | AX | EAX | RAX |
| B | BX | EBX | RBX |
| C | CX | ECX | RCX |
| D | DX | EDX | RDX |
C语言对寄存器做了封装,只能做些简单的操作,如果想进行更深层次的操作,需要使用汇编语言,对此,可以在C语言中嵌套编写汇编语言
#includeVisual Studio相关 VS执行程序时窗口闪退问题的解决方案int main(void) { int a, b, c; __asm { mov a, 3 //将3放在a对应的内存中 mov b, 4 //将4放在b对应的内存中 mov eax, a //将a放入寄存器中 add eax, b //将b放入寄存器中,并和其中的a进行加法运算,运算结果(7)依旧在寄存器中 mov c, eax //将寄存器中的运算结果放入c对应的内存中 } printf("c: %dn", c); //7 system("pause"); return 0; }
代码片段管理
- 通过system函数
#includeint main(void) { printf("hello worldn"); system("pause"); return 0; }
- 通过修改VS配置
右键项目 > 属性 > 配置属性 > 链接器 > 系统 > 子系统:控制台
- 新建一个,如main函数的
#1 #1 c语言main函数 Microsoft Corporation Expansion SurroundsWith expression 要计算的表达式 true #include#include #include #include #include int main(void) { $selected$$end$ system("pause"); return EXIT_SUCCESS; } ]]>
#2 #2 c++语言main函数 Microsoft Corporation Expansion SurroundsWith expression 要计算的表达式 true using namespace std; int main() { $selected$$end$ system("pause"); return EXIT_SUCCESS; }]]>
- 导入
工具 -> 代码片段管理 -> Visual C++几个常用快捷键
GCC编译的四个步骤 记事本创建hello.c
- 格式化代码
ctrl k + ctrl f
- 注释
ctrl k + ctrl c
- 去除注释
ctrl k + ctrl u
- 只编译不运行
ctrl shift b
#include步骤一:预处理#define PI 3.14159 int main(void) { int a = 1; #ifdef PI //判断某个宏是否被定义,若已定义,执行随后的语句 printf("PI: %fn", PI); #endif printf("hello cn"); return 0; }
步骤二:编译
- 参数:-E
- 命令:gcc -E hello.c -o hello.i
- -o 选项:表示重命名
- 主要工作
- 展开头文件
即,会将所有引入的头文件,如此例中的
中的stdio.h文件进行展开,需要注意的是,只是展开但是不会对头文件进行检查和校验,即写成 也一样会将text.txt进行展开。 gcc -E hello.c -o hello.i -I . //需要使用 -I 选项指定test.txt的所在路径
- 展开条件编译
即,在此步骤中,条件编译#ifdef部分代码会被展开执行
#ifdef PI printf("PI: %fn", PI); #endif执行后的 hello.i
printf("PI: %fn", PI);
- 替换注释
即,在此步骤中,无论单行注释还是多行注释,都会被替换为空白行
- 替换宏定义
即,在此步骤中,宏定义会执行替换工作,如例中的宏变量PI,会被替换为其宏值3.14159
//hello.i printf("PI: %fn", 3.14159);
步骤三:汇编
- 参数:-S
- 命令:gcc -S hello.i -o hello.s
- 主要工作
- 会逐行检查语法,也因此编译过程是最为耗时的过程
- 将C语言转换成汇编指令
步骤四:链接
- 参数:-c
- 命令:gcc -c hello.s -o hello.o
- 主要工作:将汇编指令翻译为机器码(二进制编码)
常量与变量 常量的定义
- 参数:无
- 命令:
gcc hello.o -o hello.exe //windows系统 gcc hello.o -o hello //linux系统,之后 ./hello 即可调用执行
- 主要工作
- 数据段合并
- 数据地址回填
- 库引入
即除了头文件外,还需要引入许多其他系统库,可以使用depends.exe查看所引入的库(将hello.exe拖入其中即可)
#define PI 3.1415926 const int a = 1;变量的定义
int var = 1;变量的声明
int var; extern int a;
#includeint a; int main(void) { printf("a: %dn", a); //0 return 0; }
#includeint main(void) { int a; printf("a: %dn", a); //windows下直接编译出错 return 0; }
#include数据类型 整形 几种整形extern int a; int main(void) { printf("a: %dn", a); //报错,因为extern修饰后无法被提升 return 0; }
- short:2字节
- int:4字节
- long:windows下4字节;linux下32位系统为4字节,64位为8字节
- long long:8字节
其他几个常用类型 字符类型
- 关键字
- signed:有符号
默认就是有符号,所以通常省略不写
- unsigned:无符号
即存储的字节中无符号位
- 字节数
有符号和无符号的字节数一样
- 关键字:char
- 字节数:1
- 常见字符与其对应的数值
| 字符 | 数值 |
|---|---|


