计算机所有信息的存储方式
计算机中采用二进制表示各种信息,也就是0和1,字节是基本单位。
一、计算机中数的表示
1.表示范围
计算机数的表示范围跟字节有关:
类型 | 表示方式 |
---|---|
无符号数 | 0 ~ 2^n-1 |
有符号数 | -2^(n-1)-1 ~ 2^(n-1)-1 |
小数:符号位+整数位+指数位
非法数字:NaN
正无穷大,负无穷大:±∞
2.原码、反码、补码
- 原码:正数的原码是将数的符号位用0表示,负数的原码是将数的符号位用1表示。
- 反码:反码表示为符号位不变,其余位按位取反。
- 补码:原码除符号位外每位取反加1。
对于正数,原码=反码=补码;对于负数,它的符号位是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 | int getFlag(int x,int y) { |
将数字x的第y位设为0或1
1 | int setFlag(int x,int y,int v) { |
二、编码
对于不同国家的语言有不同的编码方式,同样的编码在不同地方会被解释成不同的语言符号。假如我们想要打开一个文件,比如知道它的编码方式是什么,用它的编码方式打开,否则用错误的编码方式打开文件,就会遇到乱码问题。
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.堆栈
基本类型和引用类型分别存储在内存的栈和堆中。基本类型是存储在栈中的简单数据,如果我们对他进行修改,是可以直接修改成功的,而引用类型值是存储在堆中的对象,如果有两个相同对象指向同一个引用,我们修改其中一个会导致另一个也跟着修改。
五、内存回收
这个问题等我哪天想明白了再更新。。。