一.位运算
1.~:按位取反
位运算不能操作浮点型数据
2.&:按位与
与0得0,与1保持原值
第6个bit:bit5
第5个bit:bit4
3.|:按位或
或1得1,或0保持原值
4.^:按位异或
相同为0,相异为1;
交换:
int swap = a;
a = b;
b = swap
a = a + b;
b = a - b;
a = a - b;
a = a ^ b;
b = a ^ b;
a = a ^ b;
5.<<:左移运算符
a << n:3;
高位左移后溢出时,舍弃。
6.>>:右移运算符
a >> n:3;
对于有符号数:
高位是0,则补0;
高位是1:
算术右移:补1
逻辑右移:补0
对于无符号数:
高位直接补0;
二.内存管理
32位操作系统,虚拟内存有4G
虚拟内存可以细分:内核空间、堆区、系统栈区、数据区、代码段区
1.内核空间:
操作系统运行空间
2.系统栈区:
函数调用时在栈区开辟栈帧(用于存放数据型代码,即局部变量存放位置)。
从定义开始开辟空间,到离开作用域回收空间。
由操作系统自动管理。
3.堆区:
由程序员手动管理
申请:
malloc()
#include<stdlib.h>
void *malloc(size_t size);
用以在空间申请一段连续内存空间。
size:空间大小。
申请成功则返回连续空间的其实地址;失败则返回NULL。
释放:
free()
void free(void *ptr)
有申请空间的地方,使用结束后,需要释放,否则会引发内存泄漏
对malloc返回值需要进行NULL判断,否则可能会引发崩溃
拓展_内存池:
在申请空间时,会依据空间大小,申请额外的空间
存在数个不等的区间,在同一区间内,会申请相同的空间;
在不同区间内,会申请不同的空间
4.数据区:
未初始化的全局变量、静态变量。//默认初始化为0
已初始化的全局变量、静态变量。
文字常量(字符串常量)。//该空间不允许被修改
编译阶段开辟空间,程序结束回收空间
5.代码段区:
存放指令,顺序执行,需要开辟局部变量空间时跳转到系统栈区(用于存放操作型代码)。
压栈(入栈):函数调用时跳转到被调函数,为被调函数开辟栈帧。
弹栈(出栈):被调函数执行结束后跳转回主函数,被调栈帧回收的操作。
CPU中存在pc寄存器,可以在代码段进行顺序执行以及跳转执行操作。