【C++ DirectX 游戏开发教程0】内存/二进制/变量

Blossom ·
更新时间:2024-09-21
· 804 次阅读

C++ DirectX 游戏开发教程系列学习需求:

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都是不存在的,它只关心值是多少:

CPU读取address 27577,拿到9,放到一个Register里、
CPU读取address 27576,拿到60,放到另一个Register里 CPU将一个Register的值传递给另外一个,并在另外一个上存储运算结果69 CPU将69存储到address 27578 (至此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是一组相同的数据类型,
一个类,拆分到足够细,也全部都是由不同的数据类型组成的

最后请大家自行剖析C++代码执行描述来结束此节课程

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
作者:鬼蜘蛛的重生



c+ directx 游戏开发 C++ 进制 二进制 变量 教程

需要 登录 后方可回复, 如果你还没有账号请 注册新账号