1. 冯诺依曼体系结构
2. 如何理解内存
一个大走廊 每个房间1字节
房间门牌号>“地址”
3. 内存和外存
(1) 内存支持随机访问能力,访问某个地址的开销差不多
外存也支持随机访问能力,但程度不如内存,访问开销比顺序访问开销大
(2) 内存存储空间小
外存存储空间大
(3) 内存访问速度快 (内存快3--4个数量级,几千倍)
外存访问速度慢
(4) 内存成本高
外存成本低
(5) 掉电时, 内存数据丢失, 外存数据还在
4. C语言中变量类型
(1) 整数类型(char, int, short, long, long long,...)
(2) 浮点数类型(float, double)
(3) 指针类型(char*, int*)
(4)结构体
如何通过调试查看内存
字节序:
(小端字节序) 数字的低位存到内存的低地址上
(大端字节序) 数字的低位存到内存的高地址上 (和数学上的方式一致)
如何判断是大端还是小端字节序?
查看这个整数的最低地址的一个字节,小端返回1, 大端返回0.
int IsLittleEnd() {
int num = 0x11223344;
int* p = #
char* p2 = (char*)p;
if (*p2 == 0x44) {
return 1;
}
return 0;
}
int* p = &num 此处的 * 和int是一个整体, 组成(int*) 类型
printf("%d", *p) 此处的 * 是解引用操作, 根据指针变量中存储的地址找到对应的内存中的值.
关于负整数在内存中的存储: 符号位
int 既能表示正数也能表示负数, 最高位是符号位 ( 0表示正数, 1表示负数)
unsigned int 只能表示正数
计算机中存储方式为补码 (让硬件实现更简单)
原码符号位不变, 取反+1 得到补码
补码符号位不变, 取反+1 得到原码
%d: 打印一个有符号十进制的整数.
char 是一个字节得变量, 当按照 %d 打印时, 就会把 char 隐式转换为 int 类型的变量, 然后再打印.
%u: 打印一个无符号的十进制整数.
%f: 打印 float 和 double 类型的数据
%p: 打印指针变量(打印的是一个地址)
unsigned 类型的变量尽量不要用! 容易出现问题, 尤其是不同类型转换时.
类型转换 char => int => unsigned int
高位填充符号位