操作系统结构:
用户模式:应用程序都是运行在用户区域
内核模式:操作系统的内核,设备驱动程序,这些都是在内核模式下运行的
大小端与进制关系
一个位只能表示0,或者1两种状态,简称bit,一个位是一个bit
一个字节为8个二进制,称为8位,简称BYTE,8个比特是一个字节
一个字为2个字节,简称WORD。
两个字为双字,简称DWORD
进制:C语言当中0前置表示八进制,0666;用0x前置表示十六进制
原码补码和反码
原码:将最高位做为符号位(0代表正,1代表负),其余各位代表数值本身的绝对值
+7的原码是00000111
-7的原码是10000111
+0的原码是00000000
-0的原码是10000000
反码:(负数变)
一个数如果值为正,那么反码和原码相同
一个数如果为负,那么符号位为1,其他各位与原码相反
+7的反码00000111
-7的反码11111000
-0的反码11111111
补码:(减法可用加法)
原码和反码都不利于计算机的运算,如:原码表示的7和-7相加,还需要判断符号位。
正数:原码,反码补码都相同
负数:最高位为1,其余各位原码取反,最后对整个数 + 1
-7的补码:10000111(原码)
111111000(反码)
11111001(补码)
+0的补码为00000000
-0的补码也是00000000
补码符号位不动,其他位求反,最后整个数 + 1,得到原码
用补码进行运算,减法可以通过加法实现 |
7-6=1 7的补码和-6的补码相加:00000111 + 11111010 = 100000001 进位舍弃后,剩下的00000001就是1的补码 |
-7+6 = -1 -7的补码和6的补码相加:11111001 + 00000110 = 11111111 11111111是-1的补码 |
大端对齐和小端对齐
对于arm,intel这种x86构架的复杂指令CPU,整数在内存中是倒着存放的,低地址放低位,高地址放高位,小端对齐。
但对于unix服务器的CPU,更多是采用大端对齐的方式存放整数
机器语言:由二进制指令组成,是计算机可直接运行的语言。不可以一只,只能在某种类型的计算机上运行、
汇编语言:
高级语言:可移植
• 源程序: 用高级程序语言写成的程序。
• 目标程序: 源程序的机器语言版本。
• 编译器: 把高级语言写成的源程序转化为机器语言的目标程序的程序
C语言程序的过程都是由语句组成的。语句是程序的基本书写单位和执行单位,数据及其操作都是用语句的形式描述的。C语言中的语句可分为如下五种:(1)表达式语句(2)声明语句(3)空语句(4)块语句(5)流控制语句
C源程序的结构特点
1.一个C语言源程序可以由一个或多个源文件组成。
2.每个源文件可由一个或多个函数组成。
3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。
4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。
5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。
6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
在C语言中使用的词汇分为六类:标识符,关键字,运算符,分隔符,常量,注释符等。
从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、分支结构、循环结构。
C语言的缺陷:
C语言不是强类型语言,缺少对字符串和记录的处理,缺少运行期间检查,为了追求效率,运行期间,c不检查诸如数组越界之类的错误。
C中很多地方容易使得程序员产生误解,诸如运算符优先级规则,c一些地方定义不完备,执行结果因编译器不同而改变。
注意细节:变量定义时,一定要初始化,不要有多余的变量,定义了就要使用,不使用就不定义
1.Include头文件。在C语言当中,任何库函数调用都需要提前包含头文件
<头文件>,代表让C语言编译器去系统目录下寻找相关的头文件
“头文件”,代表让C语言编译器去用户当前目录下寻找相关头文件
2.return:一个函数遇到return就终止(生命周期到了)
3.编译过程:.c文件->预编译->编译->链接(库)->可执行程序
Gcc –E –o a.e a.c
预编译a.c文件,生成的目标文件名为a.e
预编译是将include包含的头文件内容替换到C文件中中,同时将代码中没用的注释部分删除
-s汇编将c语言转化为汇编语言,-c编译将代码编译为二进制的机器指令,链接 Gcc没有任何参数,代表就是链接