Number Representatioin
Sign&Magnitude, One's Complement, Bias Notation
Two's Complement 二进制补码
0000表示零
正数范围为0000-0111(零也视为正数)(0~2^(4-1)-1)
负数范围为1000-1111(2^(4-1)~-1)
因此最高位可以看作符号位
正负数符号相互转换:按位取反,再加上1
位数扩展:Copy MSB(Most Significant Byte)
C Language
compile
Pre-Processor
#define仅仅只是简单的文本替换,因此如果在define函数中出现了另一个有副作用的函数,程序可能会不按照预期执行
同样,#include也只是文本添加
#if#else#endif等:条件编译,如果满足条件,则编译这段代码
C Syntax
int大小会随着环境改变,建议使用int types固定大小,如int32_t
Typedef:定义一个新的类型(包括结构体)
Typedef uint8_t BYTE;
Typedef struct{
int member1;
intmember2;
}MyStruct;
C Memory
Int* ptr=(int*)malloc(4*sizeof(int));
使用malloc分配内存,malloc返回void*通用指针,需要强制转换成int*
需要手动释放内存,使用free函数,并且free只能释放由malloc分配的内存
使用realloc进行resize,realloc大小为零时效果等同于free
数组名和指针大致相似,但有不同
数组名不是变量(等到assembly会有解释)
程序的内存分布:
code:代码所占用的内存
Static data:全局变量占用内存
heap:动态申请的内存
stack:本地变量,调用所用的内存
注意stack和heap的增长方向,可能会重叠,可以预防(virtual memory)
Malloc&&free
Malloc会产生碎片化的问题
malloc申请和free释放,会造成空闲内存变成一块一块的,这些空闲内存块通过类似链表的结构组织在一起
当malloc申请内存时,会遍历这些内存块,并采用各种策略选择要申请的内存块(first fit,next fit,best fit)
free释放内存时,会将两个被分隔开的内存块重新连接在一起