c语言执行过程
C语言虽然支持按照我们更容易理解的方式去进行编程,但是最后还是会编译成汇编指令最后变成计算机可以直接执行的指令
基本数据类型
我们的程序离不开数据,比如我们需要保存一个数字或是字母,这时候这些东西就是作为数据进行保存,不过不同的数据他们的类型可能不同,比如1就是一个整数,0.5就是一个小数,A就是一个字符,C语言提供了多种数据类型供我们使用,我们就可以很轻松的使用这些数据了。
不同的数据类型占据的空间也会不同,这里我们需要先提一个概念,就是字、字节是什么?
我们知道,计算机底层实际上只有0和1能够表示,这时如果我们要存储一个数据,比如十进制的3,那么就需要使用2个二进制位来保存,二进制格式为11
,占用两个位置,再比如我们要表示十进制的15,这时转换为二进制就是1111
占用四个位置(4个bit位)来保存。一般占用8个bit位表示一个字节(B),2个字节等于1个字,所以一个字表示16个bit位,它们是计量单位。
我们常说的内存大小1G、2G等,实际上就是按照下面的进制进行计算的:
8 bit = 1 B ,1024 B = 1KB,1024 KB = 1 MB,1024 MB = 1GB,1024 GB = 1TB,1024TB = 1PB(基本上是1024一个大进位,但是有些硬盘生产厂商是按照1000来计算的,所以我们买电脑的硬盘容量可能是512G的但是实际容量可能会缩水)
原反补码
原码
上面我们说了实际上所有的数字都是使用0和1这样的二进制数来进行表示的,但是这样仅仅只能保存正数,那么负数怎么办呢?
比如现在一共有4个bit位来保存我们的数据,为了表示正负,我们可以让第一个bit位专门来保存符号,这样,我们这4个bit位能够表示的数据范围就是:
-
最小:1111 => - (2^2+2^1+2^0) => -7
-
最大:0111 => + (2^2+2^1+2^0) => +7 => 7
虽然原码表示简单,但是原码在做加减法的时候,很麻烦!以4bit位为例:
1+(-1) = 0001 + 1001 = 怎么让计算机去计算?(虽然我们知道该去怎么算,但是计算机不知道,计算机顶多知道1+1需要进位!)
我们得创造一种更好的表示方式!于是我们引入了反码:
反码
正数的反码是其本身。负数的反码是在其原码的基础上, 符号位不变,其余各个位取反经过上面的定义,我们再来进行加减法:
1+(-1) = 0001 + 1110 = 1111 => -0 (直接相加,这样就简单多了!)
思考:1111代表-0,0000代表+0,在我们实数的范围内,0有正负之分吗?
0既不是正数也不是负数,那么显然这样的表示依然不够合理!
补码
根据上面的问题,我们引入了最终的解决方案,那就是补码,定义如下:
正数的补码就是其本身 (不变!)。负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)其实现在就已经能够想通了,-0其实已经被消除了!我们再来看上面的运算:
1+(-1) = 0001 + 1111 = (1)0000 => +0 (现在无论你怎么算,也不会有-0了!)
所以现在,4bit位能够表示的范围是:-8~+7(C使用的就是补码!)
整数类型
整数就是不包含小数点的数据,包括以下三种类型:
-
int - 占用 4 个字节,32个bit位,能够表示 -2,147,483,648 到 2,147,483,647 之间的数字,默认一般都是使用这种类型
-
long - 占用 8 个字节,64个bit位。
-
short - 占用2个字节,16个bit位。
浮点类型
浮点类一般用于保存小数,不过为啥不叫小数类型而是浮点类型呢?因为我们的一个小数分为整数部分和小数部分,我们需要用一部分的bit位去表示整数部分,而另一部分去表示小数部分,至于整数部分和小数部分各自占多少并不是固定的,而是浮动决定的(在计算机组成原理中会深入学习,这里就不多介绍了)
-
float - 单精度浮点,占用4个字节,32个bit位。
-
double - 双精度浮点,占用8个字节,64个bit位。
字符类型
每一个字符都可以使用字符类型来保存:
-
char - 占用1个字节(-128~127),可以表示所有的ASCII码字符,每一个数字对应的是编码表中的一个字符:
编码表中包含了所有我们常见的字符,包括运算符号、数字、大小写字母等(注意只有英文相关的,没有中文和其他语言字符,包括中文的标点符号也没有)
某些无法直接显示的字符(比如换行,换行也算一个字符)需要使用转义字符来进行表示:f
prinf
printf("c的结果是:%d",c ); //使用%d来代表一个整数类型的数据(占位符),在打印时会自动将c的值替换上去
if不对变量设置初始值
溢出问题
为什么-128的补码形式是1000 0000?
参考:-128的二进制怎么表示_-128用二进制怎么表示-CSDN博客
常量表示
无符号数
类型转换
小转大
自动类型转换就是编译器隐式地进行的数据类型转换。我们直接写就行,在进行赋值或者运算操作的时候会自动进行。
大转小
整数与小数类型进行转换
转换优先级
强制类型转换
运算符
+ or -
优先级
自增自减运算符
位运算符
逻辑运算符
流程控制
相比for循环,while循环更多的用在不明确具体的结束时机的情况下,而for循环更多用于明确知道循环的情况,比如我们现在明确要进行循环10次,此时用for循环会更加合适一些,又比如我们现在只知道当i
大于10时需要结束循环,但是i
在循环多少次之后才不满足循环条件我们并不知道,此时使用while就比较合适了。
数组
多维数组
字符串
前面我们学习了数组,而对于字符类型的数组,比较特殊,它实际上可以作为一个字符串(String)表示,字符串就是一个或多个字符的序列,比如我们在一开始认识的"Hello World!"
,像这样的多个字符形成的一连串数据,就是一个字符串,而printf
函数接受的第一个参数也是字符串。
那么,我们就来认识一下字符串。