| 
 
| //----------------#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 输出一个地址
 定义在函数中变量我们称为局部变量,
 先分配字节地址大内存,然后分配字节地址小的内存
 
 变量的首地址,是变量所占存储空间字节地址最小的那个地址
 
 低位保存在低地址字节上,高位保存在高地址字节上
 
 
 
 
 
 
 
 | 
 |