内存模型

计算机所有信息的存储方式

计算机中采用二进制表示各种信息,也就是0和1,字节是基本单位。

一、计算机中数的表示

1.表示范围

计算机数的表示范围跟字节有关:

类型 表示方式
无符号数 0 ~ 2^n-1
有符号数 -2^(n-1)-1 ~ 2^(n-1)-1

小数:符号位+整数位+指数位
非法数字:NaN
正无穷大,负无穷大:±∞

2.原码、反码、补码

对于正数,原码=反码=补码;对于负数,它的符号位是1,反码就是除符号位每位取反,补码是它的反码加一。计算机对于数字是以补码的方式存储,因为不以补码的方式存储0会有两个存储方式,正数和负数相加结果不对。

3.位运算

或运算

1
1 | 0 = 1;

与运算

1
1 & 0 = 0;

异或运算(同0异1)

1
1 ^ 0 = 1; 1 ^ 1 = 0; 0 ^ 0 = 0;

取反

1
~0 = 1; ~1 = 0;

位移(左:低位补0,右移:高位补0)

1
1 << 2 = 0000 0001 << 2 = 0000 0100 = 4

应用:

求数字x的第y位为0还是1
1
2
3
int getFlag(int x,int y) {
return (x >> (32 - y)) & 1;
}
将数字x的第y位设为0或1
1
2
3
4
5
6
7
int setFlag(int x,int y,int v) {
if(v == 0) {
return x & 1 << ~(32 - y)
} else {
return x | (1 << (32 - y));
}
}

二、编码

对于不同国家的语言有不同的编码方式,同样的编码在不同地方会被解释成不同的语言符号。假如我们想要打开一个文件,比如知道它的编码方式是什么,用它的编码方式打开,否则用错误的编码方式打开文件,就会遇到乱码问题。

1.ASCII码

ASCII码一共定义了128个字符的编码。

2.Unicode

英语使用128个符号编码就够了,但是用来表示其他国家的语言却不够。所有就产生了这样的需求:需要一种编码,将世界各个国家所有的语言符号都包括进去。那么每一个符号都有对应的编码,那么我们可以通过这种编码查看文件就不会产生乱码的问题。这就是Unicode,它的名字即表示这是一种独一无二的编码。

3.UTF-8

UTF-8是Unicode的实现方式之一。

4.gb2312

gb2312是中文简体字编码。已经包括了我们生活中最常用的所有汉字与一些符号。

5.gbk

由于中文汉字繁多,gb2312只包括了六千多个汉字,还不能够完全表示,所以gbk在gb2312的基础上兼容扩展了更多的汉字,还包括繁体字。

三、内存分配

1.基本类型

基本类型在内存空间直接存储它们相应的值,比如数字,字符串。

2.引用类型

引用类型在内存空间不直接存储它们的值,而是存储这个数据的引用。比如数组、函数。

3.堆栈

基本类型和引用类型分别存储在内存的栈和堆中。基本类型是存储在栈中的简单数据,如果我们对他进行修改,是可以直接修改成功的,而引用类型值是存储在堆中的对象,如果有两个相同对象指向同一个引用,我们修改其中一个会导致另一个也跟着修改。

五、内存回收

这个问题等我哪天想明白了再更新。。。

上次更新 2020-04-01