//----------------#include指令
#include " "
包含的是一个用户定义的文件,可以是头文件,也可是普通文件
1、在当前文件所在的路径下查找
2、如果上面没有找,到编译器include路径查找
3、如果编译器include路径下没有找到,系统的include路径下查找
4、如果上面三个都没有找到就报错了。
当前文件夹 ----->编译器include ---->系统include----->(如果找不 到)报错
#include <>
包含一个系统(编译器自带)的头文件
1、编译器的include路径下查找
2、如果没有找到就系统include路径下查找
3、如果都没有找到就报错
编译器include ---> 系统include--> (如果找不到)报错
include 不一定非要写在第一行
//--------------C语言模块化编程思想
所谓模块化编程(多文件开发),就是多文件(.c文件)编程,一个 .c 文件和一个 .h 文 件可以被称为一个模块。
概念:把相同功能相似的函数封装到不同的文件中
好处:
a.只需要包含.h文件,对外隐藏源文件的实现。
b.方便团队分工和协作
c.可以将不同的功能分装在不同的模块中,方便调用。
1)通过头文件来调用库功能。
2)多文件编译。
3)头文件能加强类型安全检查。
声明在 .h中, 实现在 .c 中
.h .c名字必须一样
使用条件编译指令可以防止头文件的重复包含
#ifndef C7________xxx_h
#define C7________xxx_h
#endif
//---------------多文件开发注意事项
1)头文件中可以和C程序一样引用其它头文件,可以写预处理块,但不要写具体的语句。
2)可以声明函数,但是不可以定义函数
3)可以声明常量,但不可以定义变量
4)可以“定义”一个宏函数。注意:宏函数很象函数,但却不是函数。其实还是一个申明。
5)结构的定义、自定义数据类型一般也放在头文件中。
6)多文件编程时,只能有一个文件包含 main() 函数,因为一个工程只能有一个入口函数。我们 把包含 main() 函数的文件称为主文件。
7)为了更好的组织各个文件,一般情况下一个 .c 文件对应一个 .h 文件,并且文件名要相同, 例如 fun.c 和 fun.h。
8)头文件要遵守幂等性原则,即可以多次包含相同的头文件,但效果与只包含一次相同
9)防止重复包含的措施
自定义的方法和系统方法的xcode字体颜色不一样
长按cmd点方法,可以跳到头文件查看声明(学习方法)
//--------------进制
是一种计数的方式,数值的表示形式
十进制、二进制、八进制、十六进制
二进制 0、1 逢二进一
书写形式:需要以0b或者0B开头,比如0b101
八进制 0、1、2、3、4、5、6、7 逢八进一
书写形式:在前面加个0,比如045
十六进制 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 逢十六进一
书写形式:在前面加个0x或者0X,比如0x45
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分 别表示10,11,12,13,14,15。字母不区分大小写。
要素--->数位、基数和位权
数位: 数位是指数码在一个数中所处的位置
76543210
01100100
数码*基数^数位
1*2^0 1*2^1
基数:每个数位上所能使用的数码的个数 (二进制取值0、1基数为2,十进制取值0-9基数为10)
045; //基数8 0b00101101; //基数2 0x520A ; //基数16
位权:位权是指一个固定值 如367 3*10^2 6*10^1 7*10^0
//-------------------------转换
10 -> 2 : 除2取余法,把10进制数除以2,然后取得余数的序列,再倒序
整数部分采取”除2取余法”,小数部分采取“乘2取整法”,高位补0,将得到的余数倒序输出。
2 -> 10 : 所有位的位权相加 101 = 1*2^0+0*2^1+1*2^2
2 --> 16 : 4合1法, 整数部分从右向左 4位结合成一位,小数部分从左向右4位结合1位, 不足部分补0
16 --> 2: 1拆4法, 16进制的1位拆成二进制的4位
//-------------------------------机器数和真值
机器数:
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。
机器数是带符号的,
在计算机 用一个数的最高位存放符号, 正数为0, 负数为1.
真值: //将带符号位的机器数对应的真正数值称为机器数的真值。
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于 131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
//---------------------------原码,反码,补码
数据在计算机中的存储方法:
数据在计算机内部是以补码的形式储存的
数据分为有符号数和无符号数
无符号数都为正数,由十进制直接转换到二进制直接存储(其实也是该十进制的补码)即可。
有符号数用在计算机内部是以补码的形式储存的。
( 正数的最高位是符号位0,负数的最高位是 符号位1。
对于正数:反码==补码==原码。 对于负数:反码==除符号位以外的各位取反。补码=反 码+1)
以二进制的补码存储
正数:三码合一
负数:反码 = 源码取反,补码 = 反码+1, 或者 补码 = 源码取反 + 1,
前提都是符号位不变
正数的首位地址为0,其原码是由十进制数转换到的二进制数字
负数的首位地址为1,其原码后面的位也为10进制数转换过去的二进制数字,都是用补码方式表示 有符号数的。
1)原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值.
一个数的绝对值的二进制表示
正数:最高位改0
负数:最高位改1
2)反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
3)补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
总结
正数三码合一:
负数:
原码负号位不变,其余个位取反
补码:
原码符号位不变,其余各位取反+1,反码+1
//------------------------------------------------------------------------
1+(-1) = 0
00000000 00000000 00000000 00000001 1 源码
00000000 00000000 00000000 00000001 1 反码
00000000 00000000 00000000 00000001 1 补码
10000000 00000000000000000000000001 -1源码
11111111 11111111 11111111 11111110 -1反码
11111111 11111111 11111111 11111111 - 1补码
00000000 00000000 00000000 00000001 1的补码
11111111 11111111 11111111 11111111 + -1的补码
----------------------------------------------------------------------------
00000000 00000000 00000000 00000000 0
1(源码) + (-1)(源码) = -2
1(反码) + (-1)(反码) = -0
1(补码) + (-1)(补码) = 0
//-----------------------位运算
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。
C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的 char,short,int与long类型。
1)& 按位与 口诀: 同1为1,有0为0
只有对应的两个二进位均为1时,结果位才为1,否则为0
2) | 按位或 口诀:有1则1
只要对应的二个二进位有一个为1时,结果位就为1,否则为0
3) ^ 按位异或 口诀:同0非1
当对应的二进位相异(不相同)时,结果为1,否则为0
4)~ 取反
各二进位进行取反(0变1,1变0)
以上都是在二进制进行运算
1)<< 左移
1、各二进位全部左移n位,高位丢弃,低位补0
1)左移可能会改变一个数的正负性
2)左移1位相当于*2^n
举例:快速计算一个数乘以2的n次方
(8<<3 等同于8*2^3)
2)>> 右移
各二进位全部右移n位,保持符号位不变
x >> n
x的所有二进制位向右移动n位,移出的位删掉,移进的位补符号位
1、右移不会改变一个数的符号
2 右移 n 位就相当于/2^n
用途:快速计算一个数除以2的n次方 (8>>3 等同于8/2^3)
技巧:
1)任何数和1进行&操作,得到这个数的最低位
2)想把某一位置0,就让它某一位置与0进行&运算
理解:
1)编程实现10进制转2进制
// 每次取 一个数的最后一个二进制位 >>(31-i)
// 任何一个数和1进行&(按位与)得到任何一个数的二进制的最后一位
第一次取出符号位
a&1 --> 1 奇数
--> 0 偶数
1)数学方法:
a = b - a;
b = b - a;
a = b + a;
2)
int temp = 0,a = 1,b = -1;
temp = a;
a = b;
b = temp;
3)实现两个变量值交换
a = a^b;
b = a^b; --> a^b^b; --> a
a = a^b;--> a^b^a; --> b
1001 a
^ 1101 b
----------------------
0100
^ 1101 b
-----------------------
1001
//----------------变量地址获取及存储原理
%p 输出一个地址
定义在函数中变量我们称为局部变量,
先分配字节地址大内存,然后分配字节地址小的内存
变量的首地址,是变量所占存储空间字节地址最小的那个地址
低位保存在低地址字节上,高位保存在高地址字节上
|
|