1. 任意一门现代编程语言的语法基础
2. 英文基础(术语皆会使用英文,旨在培养大家将来Google与阅读文档的能力)
3. 心如止水,持之以恒
当我们说内存(Memory)时,一般情况下是指RAM,即Random Access Memory,意味着你可以使用任意顺序去访问内存上的任意位置。其机制和1D Array完全一致。如下图对比:
1D Array有总房间数length间,每个房间装1个element,每个房间有对应门牌号index
Memory有总房间数size间,每个房间装1个location,每个房间有对应门牌号address,
每个房间里住的是1个byte(1byte = 8bit)
让我们来深入地看一下CPU是怎样与Memory运转的
CPU的核心电路有特殊的存储空间叫Registers,可以把它们理解为CPU用来做事情的N只手
int c = b + a;
首先c b a会存储到Memory中,CPU会从Memory中读取它们然后拿到自己手里
在CPU的眼里,c b a都是不存在的,它只关心值是多少:
int c = b + a;
执行结束)
小结:
RAM就是一个byte组成的Array,每个byte对应一个address,每个byte由8个bit组成
为了能够充分理解byte和bit,我们需要先搞清楚二进制(Binary)的概念:电子元件有两种工作状态:ON OFF
bit是一种能够表达两种情况的符号或数值,也就是说bit可以用来表达电子元件的工作状态,
一般情况下,我们用0代表OFF,1代表ON
即:1个bit可以代表2种状态;2个bit可以代表22=4种状态;3个bit可以代表23=8种状态
1个byte由8个bit组成,也就是有28=256种状态,所以能够表达的最大整数为255,
即C/C++中的 unsigned char
有没有觉得255这个数字很熟悉呢?
不管是十进制(Decimal)、二进制(Binary)、还是十六进制(Hexadecimal),它们只是存储数据的不同“字体”而已。用不同的进制去表达相同的数据,不会改变其数据本身的意义。计算机的电子元件存储是基于binary的,所以1个byte的值为00000000到11111111,等价于0到255,其二者所表达的意义完全相同。不存在“某些数据是decimal存储的,某些数据是binary存储的”这种说法。
人类有10根手指,所以很多文明都是采用的十进制计数法,
计算机有2根手指,所以其采用的是二进制计数法,
仅此而已
bit是binary digit的简写
byte只是比bit大了一些,但如果写为bite会很怪,所以就命名为byte了
4 bit = 1 nibble,之所以把4个bit列为1个特殊单位,是因为它与十六进制很搭
4位数的binary完美表达1位数的hexadecimal:24 = 16
我们给出一个任意hexadecimal:AF62
可以对照表格轻松地转换为binary:1010 1111 0110 0010
但如果想尝试将它转换为decimal的话,那就完全是另外一回事了
进而hexadecimal的用处十分常见,因为方便人类读写,比如说指针,
所以永远也不要让我逮到你说什么“指针是存储在十六进制里的”,我反手就是一巴掌
至此数据类型的Size和Range便清晰了然了
需要提一点的是数据的size不是固定不变的,我们平时所说的32位系统,64位系统,
其实就是一次能读取32bit的数据,还是一次能读取64bit的数据,
古老的操作系统也有16bit的,
但99.9%的情况下,char是8bit,short是16bit,int是32bit,long long是64bit
如果你真的需要极限性能,C++11引入了固定大小的类型,但大部分情况下我们直接使用int即可
需要理解的是程序的一切都是由数据类型组成的,int是1个数据类型,Array是一组相同的数据类型,
一个类,拆分到足够细,也全部都是由不同的数据类型组成的
case A
int main()
{
int x = 60;
int y = 9;
int z = x + y;
return 0;
}
case B
int main()
{
int arr[4] = { 16, 256, 65536, 65535 };
arr[0] = arr[2] + arr[3];
return 0;
}
case C
class Backyard
{
public:
int bush;
char wall[2] = { 1, 2 };
int brick= 10;
};
int main()
{
Backyard b;
b.brick = b.wall[1];
return 0;
}
case D
class Backyard
{
public:
int bush;
char wall[2] = { 1, 2 };
int brick= 10;
};
int main()
{
Backyard bd[2];
bd[0].brick = bd[1].wall[1];
return 0;
}
这些公式的成员看似莫名其妙,但如果能够自己研究明白的话,是受益无穷的。
下一期我们将会学习:指针(Pointer)
喜欢的话可以三连、打赏,以后会持续更新质量的C++教程
交流群:857043776