一、自定义数据类型
1、自定义数据类型(自定义容器大小)
struct--结构体--元素进行累加
union--共用体--元素进行共用
2、结构体语法
基本数据类型 变量名;
自定义数据类型 变量名;(先告知编译器 自定义数据类型的名字,然后才能使用)
例:struct abc data;
结构体语法:
struct abc{
int a;
char b;
short c;
};
共用体语法:
union abc{
int a;
char b;
short c;
};
注:(1)使用:C语言必须用struct/union和变量名配对使用
struct abc data;
改进:借助typedef起别名
typedef struct { //自定义类型声明
int a;
char b;
short c;
}abc;
abc data;//变量申请
(2)定义结构体和共用体时,仅告知编译器定义新的容器,并未在内存上进行任何操作
自定义数据类型 变量名;
(3)经过(自定义数据类型 变量名;),才真正的申请到空间
(4)访问结构体成员
.--变量名访问--变量名.结构体成员
->--地址访问
二、结构体对齐方式
结构体中为了提高CPU的访问效率,编译器会自动根据结构体成员情况,来设置一个对齐方式
结构体字节对齐行为:CPU一个周期能读出的整数个成员
做法:(1)编译器先选择对齐因子(结构体成员中,基本数据类型的最大值)
(2)根据对齐因子,组织成员(按顺序),保证对齐因子,都出现整数个成员
自定义对齐:设置一字节对齐
#pragma pack(1)
默认对齐
#pragma pack()
三、结构体位域技术
typedef struct {
int a:4;
int b:5;
int c:6;
}abcd;
位数不超过定义的最大位数
四、C语言基本运算
1、基本运算符(+ - * / %)
运算结构:
(1)一元运算符:~
(2)二元运算符:+ -
a=a+b-->a+=b
(3)三元运算符:? :
基本运算:
+:越界问题
*:*2--位左移一位
/:/2--位右移一位(根据有无符号数来补位)
%:求余数
(1)m%n,无论m值多大,范围为[0,n-1]
例:产生200--300的数值,[0-100] --m%101+200=[200,300]
(2)得到一个循环的数列
例:i++
i=i%max
2、位运算
bit之间的运算规则
(1)位与、位或、位非
位与:&(遇0得0,主要用于清0)
例:x位清0
a &= ~(0x01<<x)
位或:| (遇1得1,主要用于置1)
例:x位置1
a |= (0x01<<x)
位非:~(取反)
(2)左移、右移
(3)异或操作
异或:^(相同为0,相异为1)
使用:a、加密 解密
b、使用两个变量完成交换
a=a^b;
b=a^b;
a=a^b;
3、逻辑运算
逻辑行为:真or假(真:非0值,假:0)
逻辑与:&&(1/0)
逻辑或:||(1/0)
4、高级位运算
多个空间设置值
例:给一个int空间的第5、6、7、8bit设置为1100
int a;先清除,再设置
a &= ~(0xF<<5);
a |= (0xC<<5);