顺序执行程序segmentfault
机器数数组
定点数与浮点数
定点数是小数点固定的数。在计算机中没有专门表示小数点的位,小数点的位置是约定默认的。通常固定在机器数的最低位以后,或是固定在符号位以后。前者称为定点纯整数,后者称为定点纯小数。
定点数表示法简单直观,可是数值表示的范围过小,运算时容易产生溢出。微信
浮点数是小数点的位置能够变更的数。为增大数值表示范围,防止溢出,采用浮点数表示法。浮点表示法相似于十进制中的科学计数法。网络
在计算机中,一般把浮点数分红阶码和尾数两部分来表示,其中阶码通常用补码定点整数表示,尾数通常用补码或原码定点小数表示。为保证不损失有效数字,对尾数进行格式化处理,也就是平时所说的科学计数法,即保证尾数的最高位为 1,实际数值经过阶码进行调整。
阶符表示指数的符号位、阶码表示幂次、数符表示尾数的符号位、尾数表示格式化后的小数值。函数
N = 尾数 x 基数阶码(指数)
位(Bit):是电子计算机中最小的数据单位,每一位的状态只能是 0 或 1.编码
字节(Byte):8 个二进制构成 1 个字节(Byte),它是存储空间的基本计量单位。1 个字节(Byte)能够存储一个英文字母或半个汉字,换而言之:1 个汉字占据 2 个字节(Byte)的存储空间。spa
字(Word):由若干个字节构成,字的位数叫作字长,不一样档次的机器有不一样的字长。例如:一台 8 位机,它的 1 个字就等于 1 个字节。若是是一台 16 位机,那么它的 1 个字就由 2 个字节构成,字长为 16 位。字是计算机进行数据处理和运算的单位。操作系统
字节序(字节顺序)是指占内存多于一个字节类型的数据在内存中的存放顺序,一般有小端、大端两种字节顺序。3d
小端字节序(Little Endian):指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;
大端字节序(Big Endian):指高字节数据存放在低地址处,低字节数据存放在高地址处。code
基于 X86 平台的 PC 机是小端字节序的,而有的嵌入式平台则是大端字节序的。全部网络协议也都是采用大端字节序的方式来传输数据的,因此有时咱们也会把大端字节序称之为:网络字节序。
好比数字 0x12345678 在两种不一样字节序 CPU 中的存储顺序以下所示:
大端字节序(Big Endian) 低地址 高地址 ----------------------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 12 | 34 | 56 | 78 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 小端字节序(Little Endian) 低地址 高地址 ----------------------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 78 | 56 | 34 | 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
联合体 union
的存放顺序是全部成员都从低地址开始存放,利用该特性,就能判断 CPU 对内存采用 Little-Endian 仍是 Big-Endian 模式读写。
示例代码:
union test { short value; char str[sizeof(short)]; }example void main() { example.value = 0x0102; if (sizeof(short) == 2) { if (example.str[0] == 1 && example.str[1] == 2) { printf("大端字节序"); } else if (example.str[0] == 2 && example.str[1] == 1) { printf("小端字节序"); } else { printf("结果未知"); } } }
现代计算机中内存空间都是按照 byte 划分的,从理论上讲彷佛对任何类型的变量的访问能够从任何地址开始,但实际状况是在访问特定类型变量的时候常常在特定的内存地址访问,这就须要各类类型数据按照必定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
好比有的平台每次都是从偶地址处读取数据,对于一个 int 型的变量,若从偶地址单元处存放,则只需一个读取周期便可读取该变量,可是若从奇地址单元处存放,则须要 2 个读取周期读取该变量。
offset
为 0 的地方,之后每一个数据成员存储的起初位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,好比说是数组、结构体等)的整数倍开始,好比 int 在 32 位机为 4 字节,则要从 4 的整数倍地址开始存储。struct a
里存有 struct b
,b
里有 char
、int
、double
等元素,那么 b
应该从 8 的整数倍开始存储。)sizeof
的结果,必须使其内部最大成员的整数倍,不足的要补齐。操做系统五大功能:
中断:计算机执行程序的过程当中,因为出现了某些特殊事情,使得 CPU 暂停对程序的执行,转而去执行处理这一事件的程序,等这些特殊事情处理完以后再回去执行以前的程序。
中断分三类:
简单说,对中断的理解就是对一些特殊事情的处理。
与中断紧密相连的一个概念就是中断处理程序,当中断发生的时候,系统须要去对中断进行处理,对这些中断的处理是由操做系统内核中的特定函数进行的,这些处理中断的特定的函数就是咱们所说的中断处理程序。
另外一个与中断紧密相连的概念是中断的优先级,中断的优先级说明的是当一个中断正在被处理的时候,处理器能接收的中断的级别。中断的优先级代表了中断须要被处理的紧急程度,每一个中断都有一个对应的优先级,当处理器在处理某一中断的时候,只有比这个中断优先级高的中断能够被处理器接受而且被处理。优先级比这个当前正在被处理的中断优先级要低的中断将会被忽略。
中断优先级:
机器错误 > 时钟 > 磁盘 > 网络设备 > 终端 > 软件中断
当发现软件中断时,其余全部的中断均可能发生并被处理;但当发生磁盘中断时,就只有时钟中断和机器错误中断能被处理了。
进程的执行在系统上的两个级别:用户级(用户态)和核心级(系统态)。
程序的执行通常是在用户态下执行的,但当程序须要使用操做系统提供的服务时,好比说打开某一设备、建立文件、读写文件等,就须要向操做系统发生调用服务的请求,这就是系统调用。
Linux
系统有专门的函数库来提供这些请求操做系统服务的入口,这个函数库中包含了操做系统所提供的对外服务的接口,当进程发出系统调用以后,它所处的运行状态就会由用户态变成核心态。但这个时候,进程自己其实并无作什么事情,这个时候是由内核在作相应的操做,去完成进程所提出的这些请求。
系统调用和中断的关系在于:当进程发出系统调用申请的时候,会产生一个软件中断。产生这个软件中断之后,系统会去对这个软中断进行处理,这个时候进程就处于核心态了。
用户态和核心态区别:
在系统中内核并非做为一个与用户进程平行的进程的集合,内核是为用户进程运行的。
一个没有鸡汤只有干货的公众号