菜单

Dau
Dau
发布于 2025-01-16 / 16 阅读
0
0

CS61C Notes NumRep&C Lang

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释放内存时,会将两个被分隔开的内存块重新连接在一起


评论