一、编程语言的概念
1、计算机之父冯诺依曼提出计算机的理论:计算机应该采用二进制(因为电子元件具有双稳态特性,双稳态指的是0和1 —>数据是存储在内存 中–>内存由存储单元组成–>存储单元由触发器组成–>触发器由门电路组成–>与门、或门、非门)。
2、C语言的标准是由美国国家标准协会(ANSI)进行制定,当时的C语言也被称为ANSI C ,后期由ISO(国际标准化)组织重新进行发布,目前为止,一共发布了3套关于C语言的标准(C89/C90、C99、C11、C18)。
3、ASCLL表:常见:0 ---- 48 A ----- 65 a ---- 97
4、C语言是一门面向过程的编程语言,面向过程是一种编程思想,面向过程指的是把一个大的问题拆分为多个小问题,然后把每个小问题单独的进行解决,从而达到解决大问题的目的。可以理解为“大事化小,小事化了”。面向过程的设计思想采用的是“自顶向下”的设计原则,指的是程序从上到下顺序执行的。C语言标准中规定了程序是从main函数开始顺序执行的。
5、main函数的返回值
- 如果是int类型,则返回值会作为exit函数的参数,传递给exit函数,exit函数的功能是终止程序,其实exit函数是一个记录程序退出状态的函数,当exit的参数是0或者是EXIT_SUCCESS,则表示程序是正常退出的,如果exit函数的参数是EXIT_FAILURE,则表示程序是异常退出的。注意:系统会自动调用exit函数来记录程序的运行状态,当然用户也可以手动调用该函数。
6、函数调用
- C语言程序的基本单位是函数,因为C语言采用的面向过程的设计思想,需要把大问题拆为小问题,每个小问题都通过特定的代码段来解决,每个代码段就可以封装为一个函数。
- 一个程序是由一个主函数和若干个子函数组成的,主函数是固定的,就是main函数,主函数作为程序的入口,子函数是不固定的,一般子函数的类型有两种:库函数 and 自定义函数。
7、<>和" "的区别(笔试题)
#include <stdio.h> //使用<>包含头文件,编译器在查找头文件的时候默认从系统路径下找
#include “stdio.h” //使用””包含头文件,编译器在查找头文件的时候默认从当前路径下查找,
//如果没找到再去系统路径下找,如果还没找到则报错
8、C语言标准中常用的关键字有32个,Linux系统下shell命令都必须借助终端进行输入,终端的启动方式:图标or快捷键(ctrl+alt+t)
9、内存概念
- 这里涉及到计算机的组成原理,冯诺依曼架构的计算机是由五个部分组成,分别是运算器、控制器、存储器、输入设备、输出设备。
- 计算机工作的流程:用户通过输入设备把数据写入到存储器中,然后控制器会根据存储器地址读取地址下的数据,然后控制器把数据传递给运算器,运算器对数据进行运算,然后把运算结果传递给控制器,控制器再把数据写回到存储器中,然后再利用输出设备反馈给用户。
- 输入设备 -> 存储器 -> 控制器 -> 运算器 -> 控制器 -> 存储器 -> 输出设备
- 计算机中的程序都是运行在内存中,而内存分为两种:只读存储器ROM or 随机存储器RAM,只读存储器是断电以后数据不会丢失;随机存储器是掉电数据会丢失。
10、在32位系统内存大小:4G = 4 * 1024 * 1024 *1024 * 8 = 2^32 --> 0x0000_0000 ~ 0xFFFF_FFFF。计算机处理数据的基本单位是字节,而
- 1 byte = 8 bit
- 1 KB= 1024 * 8 bit
- 1 MB = 1024 * 1024 * 8 bit
- 1GB = 1024 * 1024 * 1024 * 8 bit
11、命名规则
- 变量和常量也被称为标识符,对于标识符的命名必须遵循规则:标识符是由字母、数字、下划线组成,并且标识符的第一个字符只能是字母或者下划线。
12、一般32位系统的数据总线和地址总线都是32位,也就是CPU每次寻址的时候是以4字节为单位
13、 如果一个变量没有明确的使用unsigned来进行修饰,则系统会默认变量是有符号的。前导符(前缀),规定八进制的前缀以0表示,比如064,规定十六进制的前缀以0x/0X表示
二、进制之间的关系
1、二进制
- 二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头
2、八进制
- 八进制由 0~7 八个数字组成,使用时必须以0开头(注意是数字 0,不是字母 o)
3、十六进制
- 十六进制由数字 0~9、字母 A~F 或 a~f( 不区分大小写 A == 10 B11 C12 D13 E14 F==15)组成,使用时必须以0x或0X(不区分大小写)开头
4、十进制转二进制
- 方法为:十进制数除2取余法。(转八进制时为除8取余法;转十六进制时除16取余)
5、其他进制转换
向十进制转时,将各位数按权展开,从右向左依次拿每位上的数乘以二(八 / 十六)的 0 1 2 ……次方,然后相加的和即是相应的十进制数。
独特二进制转化方法:权位值
2048 1024 512 256 128 64 32 16 8 4 2 1
独特转化方法:将对应的二进制权位值进行相加即可得对应的十进制数
1 1 0 1 0 1 化成十进制:32+16+4+1 = 53
6、二进制转八进制
方法为:每3位二进制数按权展开,然后相加得到1位八进制数。(注意事项,每3位二进制转成八进制是从右到左开始转换,不足时补0)。
7、八进制转二进制
方法为:将八进制数的每一位通过除2取余法得到一个二进制数,这个二进制数必须是3位,如果不够3 位,则最左补0。
8、二进制转十六进制
与二进制转八进制相似,每四位按权相加得到一个数,从最右开始,最后若不足4位则向最左边补0,然后得到十六进制数。
9、 十六进制转二进制
方法为:将十六进制数的每一位通过除2取余法,得到二进制数,每一位十六进制数得到的二进制数都应该是4位,不足时在最左边补零。
10、二进制数、八进制数和十六进制数的输出
C语言中常用的整数有 short、int 和 long 三种类型,通过 printf 函数,可以将它们以八进制、十进制和十六进制的形式输出。不能使用 printf 函数输出二进制。在格式控制符中加上#即可输出前缀,例如 %#x、%#o、%#lX、%#ho
11、整数在内存中的存储
1) 原码
- 将一个整数转换成二进制形式,就是其原码。例如short a = 6;,a 的原码就是0000 0000 0000 0110;更改 a 的值a = -18;,此时 a 的原码就是1000 0000 0001 0010。
- 正数与负数的原码区别在于符号位(二进制最高位表示,0:正数,1:负数)
2) 反码
- 对于正数,它的反码就是其原码(原码和反码相同);负数的反码是将原码中除符号位以外的所有位(数值位)取反,也就是 0 变成 1,1 变成 0。a 的值a = -18;,此时 a 的反码是1111 1111 1110 1101
3) 补码
- 对于正数,它的补码就是其原码(原码、反码、补码都相同);负数的补码是其反码加 1。a 的值a = -18;,此时 a 的补码是1111 1111 1110 1110 = 1111 1111 1110 1101(负数反码)+ 1。
- 在计算机内存中,整数一律采用补码的形式来存储。这意味着,当读取整数时还要采用逆向的转换,也就是将补码转换为原码。将补码转换为原码也很简单:先减去 1,再将数值位取反即可。
4)数据存储方式:大端存储和小端存储
- 大端存储:Big -Endian 高位数据存储在内存的低位
- 小端存储:Little-Endian 低位数据存储在内存的低位
12、整数取值及整数溢出 - 在现代操作系统中,short、int、long 的长度分别是 2、4、4 或者 8,它们只能存储有限的数值,当数值过大或者过小时,超出的部分会被直接截掉,数值就不能正确存储了,我们将这种现象称为溢出(Overflow)
- unsigned char 类型的取值范围是 0~255。
- signed char 类型的取值范围是 -128~+127。
- 有符号数以补码的形式存储,计算取值范围也要从补码入手。我们以 char 类型为例,从下表中找出它的取值范围: