结构体
因为在描述一个内容时候,自带的内置类型不够,于是通过结构体进行自定义创造合适的类型
structStu{charname[20];intage;charsex[5];charid[20];};//注意这里的分号不能丢结构体变量
structStu{charname[20];intage;charsex[5];charid[20];}s1,s2,s3;structStu{charname[20];intage;charsex[5];charid[20];};structStus1;intmain(){structStus2return0;}对于结构体更推荐第二种写法,会更加的灵活
初始化
初始化的时候可以直接按照顺序进行初始化
也可以在括号里面分别按照自己的想法进行初始化
注意需要描述的时候需要写出被写的项目并且在他前面加一个“.”并且字符串需要用引号括起来
赋值
数组不可以直接整体赋值,但是结构体可以整体赋值
结构成员访问操作符
直接访问
间接访问
结构体传参
将一个结构体的信息传递给函数
可以通过传递结构体变量或者变量的地址
底层程序设计
进制认识及进制转换
有2,8,10,16 进制。并且他们之间可以相互转化
2进制,从右到左第一位开始时2^0 开始 往左多少位,次数上加一
其他同理
16进制从10开始用A,B,C,D,E,F代替
进制转化
对于8,16进制转化
8进制从又开始3个数字组成一个2进制
16进制则是4个数字组成
2进制中的原码,反码,补码
对于有符号整数来说有符号位以及数值位两部分,并且最高位的第一位是被当作符号位,其余是数字位。用0 表示正, 1 表示负
对于正整数来说原,反,补码都是相同的
但是对于负整数来说表达方式不太一样,原码时直接按照2进制翻译出来得到的。反码符号位不变,其余位次按位取反得到。补码:反码+1
原码得到补码可以取反+1 同理补码得到原码也可以取反+1
对于无符号整数。三种表达相同,没有符号位, 每一位上都是数值位
在内存中,存放的是2进制的补码
存放时的大小端字节序
小端字节序
低位字节内容放到低地址处,高位字节,保存到内存中的高地址
例如 输入 11223344 时 11 属于高位地址。44属于低位地址,输出的时候输出为 44332211
大段字节序
低位字节出现到高内存处
更加符合人类思维
判断大小端
输入一个整型数字1 取出地址后 将他强制转换成char 类型,输出如果== 1的话就是小端
浮点数的存储
浮点数和整型数字的存储不同
在内存中的存储也是按照S,M,E进行存储
因为这些导致精度不够容易 也导致整数类型进行的时候与正常不一样
移位操作符
左移
右移
因为编译器编译时候 会分为逻辑右移以及算术右移
逻辑右移的时候 左边用0填充,右边丢弃
算术右移时 左边的用原该值的符号进行填充,右边丢弃
a >> b
对于无符号类型的进行逻辑右移 最高位置补0 结果 = a/ 2^b 结果再向下取整
有符号类型的 当a>= 0的时候时 算术右移,结果同上,a<0的时候通常时算术右移,最高位置补符号位
无论左移还是右移 最好用无符号类型,有符号也可以强制转换成无符号类型再进行![]()
位操作符 & | ^ ~
& 按位与 a & b 对应二进制有0就是0 ,同时为1才是1
| 按位或 a | b 对应二进制有1就是1, 同时为0才是0
^ 按位异或 a ^ b 对应二进制相同为0 相异为1
~ 按位取反 ~a 对于所有的二进制,逐个取反 0变成1 1变成0
必须是整数
可以直接进行计算
计算的时候用补码
有0就是0 ,同时为1才是1
有1就是1, 同时为0才是0
计算之后再进行取反+1
相同为0 相异为1
逐个取反 0变成1 1变成0
实现两个整数的交换
1 创建一个临时变量进行储存交换
直接进行交换
存在溢出的风险
异或运算的特点
a^a=0两个相同的数字异或是0
a^0=0 任何数字和0异或还是它自己
a^ b ^ a = a ^ a^ b 异或支持交换
在编码的时候,通常会选择1进行编码
计算一个2进制中1的个数
通常和计算一个十进制的数字1的个数类似
进行 / 以及%
进行2进制的时候会选择进行 %2 以及 /2
整型和无符号整型得到的结果不同
通过移位操作符去得到想得到的位置
想要得到一个二进制中1的个数可以循环32次去找1
但是方法太过于低效
引用函数进行
n = n&(n-1)
判断一个数字是不是2的幂次方