声明C51的变量到底需要知道哪些!
序
写给我的孩子,目前初中二年级,虽然做出来了模拟交通灯,虽然做出来了点阵显示,虽然做出来数字时钟。但是他还不知道单片机的运行机制,还不清楚什么是内存,什么是代码,还不清楚程序是怎么运行的!
还有很多东西不理解,或者理解的不深刻!
记录下来就当给他讲课了!
也是我自己的学习和整理的过程!
一、【数】
伸开自己的一只手,看看自己的手指头!我们可以很轻松的回答出来,我有5个手指头!
那么好了,我们在伸开另外一只手,告诉我有几个指头呢?
10
这或许是很小的孩子都能回答的问题!
那么到底什么是【数】?
我们的两只手就在自己面前,我们用了一个【10】就描述出来了它的量,或者 个数
那我们为什么用的是【10】,而不是其他的呢?
那么【10】存在吗?
【10】是我们大脑的产物!是我们用于更好的沟通所发明和创造出来的一种意识!
好比,我们称自己是【人】,那如果最开始,我们说我们自己不是用【人】,而是【猫】或者【狗】!
那我们就是【猫】或者【狗】了。
我们可以随便换一个词来取代【人】,比如【神】。
换了个名字我们就是真的【神】了吗?
有一天,当我们跟别人沟通的时候,、
我们说某【神】怎么怎么样了,
和
我们说某【人】怎么怎么样了,
那个更方便呢?
我需要和另外一个我接触到的所有人说一下,【神】就是【人】。
是不是很累!
是不是很没有必要!
因为这个改动严重影响了相互之间的沟通,打破大家已经熟悉的规则!
我就站在这里,你喊我【人】,你喊我【猪】,你喊我【狗】,都不影响我。
我还是我,
而【猪】、【狗】均是你的意识里面的东西
我不会因为你怎么描述我而改变!
那么【数】是什么?
【数】是我们描述一种量的意识,是我们沟通的规则。
当所有人都知道这个规则,都遵循这个规则的时候,那么我们之间的沟通就不会有障碍!
所以它能被用到现在!
2只手,每个5个指头,不会因为我们说它是【10】还是【A】,还是【1010】而改变!
十进制 16进制 二进制
二、进制
1、【二进制】名字的由来
任何一个东西的产生或发明都不是偶然的,当一个新的物品被人给创造出来之后,那么我们必须用一种形式来描述它,而这个形式具体是什么,是由创造它的人先定义的!
计算机只认识【0】和【1】,这句话好像也不对,其实计算机也不认识【0】和【1】,它们仅仅是一个开关。有【通】和【断】两种形态,按照一定的组织形式通和断,从而实现了一定的功能。它们不知道什么是高电平,什么是低电平。它们甚至不知道是通还是断。我们仅仅是用了它们本该有的物理特性,让它们为我们做了一些事情。
【0】和【1】是我们人为了描述【通】和【断】为了沟通方便才定义的。
那么什么是【0】,什么是【1】?(这个问题涉及到的东西太多了,一时还没想好怎么讲明白!此处省略1W字)
所以需要给这个只有【0】和【1】的数的描述 方式 起个名字!
虽然名字不重要,但是我们所有人听到一个词的时候,都会自动脑补,自动关联一些自己以前知道的事情,这或许是我们大脑的强大之处。
比如,一个女孩,非要起个名字叫【狗蛋】,一个男孩非要起个名字叫【傻妞】!
虽然这样喊没问题,但是会带来沟通上的障碍。
没有人约束我们给孩子起什么样的名字,但是我们自己就会考虑好这个名字怎么起,
为了是将来少些麻烦!
为了将来别人听到这个名字时就觉得很美,更容易被记住!
那么只有【0】和【1】的这个数它的名字应该叫什么呢?
那我们自然会想到0-9然后是10,它是逢10进一,我们称之为【十进制】
而【0】和【1】它是【逢二进一】,所以,它就叫【二进制】吧。
那么还有一个问题!
以前世界上只有0~9,然后10、11等等
现在多了一个【二进制】它也会有00、01、10、11
那么人们 看到 或 听到 10、11时,它就有两种含义了,可能是【十进制】也可能是【二进制】
那我们沟通时就需要明确出来,你说的是十进制的10,还是二进制的10,因为它们的具体意义已经很不一样了。
于是,又发明了一个【符号】来区分它们,
这就是新规则诞生的原因!
我觉得这也是我们人强大的根源,
因为我们发现了问题,我们用【创造】解决了我们的问题!
我们没有选择逃避,没有选择放弃,而是起了一个非常优雅,非常具有实际意义的名字【二进制】
这个名字简直完美!
(只不过所有的这些过程,均是由别的国家的人来完成的!不是我们自己!)
在写这段文字的时候,我一直在想,我用【我们】是不是合适!因为真的不是我们创造的!
那就是10D 或 10d 代表的是【十进制】数
那么 10B 或 10b代表的是 【二进制】数
虽然这样很清楚,但是也带来了另外一个问题!
那就是对于一个从未接触过【二进制】的人来说 【10】 就是 【十进制】的10,人家很明白
因为有了【二进制】,所以【十进制】的【10】要写成【10d】或【10D】,
那么会导致有很大一部分人不理解,和他们沟通起来会很困难
为了应对这种情况,那我们干脆【十进制】数还是什么都别带了吧!
现在【10】就是【十进制】数,是默认的,是所有人都能接受和理解的方式!
因为这样,大家皆大欢喜!
没有人因为新规则的制定而导致以前规则的废弃,
通过一种包容或包涵,轻松的达到了目的,这就是
【向前兼容】。
而【10b】则是【二进制】,懂得人自然懂,不懂得自然不懂!
我原来一直以为在写程序时,这个【d】要省略了就默认是十进制的原因是为了让我们少敲几下键盘。
这么想来,我现在的想法更贴近它的演变过程。
如果他们第一时间想到【向前兼容】那么就不会发明出来10d中的这个d了,因为是多余的!
但这并不能阻碍任何的发展!
或许人家用了一段时间后发现它带来的问题,就及时修正了!
所以我们现在用起来很舒服!
2、【十六进制】的由来
人们通过一个可以通过一个无限长的【0】和【1】的任意组合,来让计算机帮我们做事情!
但是我们的脑容量,虽然能很轻松的处理很多问题,
但是几乎不可能记下来那么多单调的仅有【0】和【1】的组合串。
虽然简单到只有【0】和【1】,但是我们需要记下的不是他们本身,而是他们的序列,还是一个不可错的序列。
因为一个错了,就能导致计算机的运行结果千差万别。
大脑记不下来,但是我们又需要跟别人沟通。
所以我们需要改变一种形式,能让其他人更好的,更快速知道我们要描述的是什么!
那就打包吧!
4个【二进制】位组合起来,能描述16个数值,从0~15二进制十进制十六进制000000000111001022001133010044010155011066011177100088100199101010A101111B110012C110113D111014E111115F
为了能用一个字符来描述出来这16个数,又发明了【十六进制】即用0~9和A~F来代表
为什么非要用一个字符来描述呢
因为当【二进制】位从4位发展到8位的时候,
比如 0101,1010b =>5AH
5 A
那么,每四位就是一个字符,就会对应的非常舒服!
那么又多了一种数的描述形式,即【十六进制】那么它也需要一个符号来区分。
比如 同样是 11 ,可能是十进制,也可能是二进制,也可能是16进制,
他们之间是存在重叠问题的,只要
描述的不能唯一确定,
就需要增加一个东西来把他们区分出来
所以 11d 、11b、 11H就分别是十进制、二进制和十六进制了
因为十进制我们是默认的,所以 11,看到了如果没有上下文的关系,我们都会认为它是十进制的十一。
d b h 这三种符号是51单片机汇编语言中的进制的描述方式。
如果不是汇编语言了呢,换成了C51语言呢,该怎么描述呢?
C51语言中:
x = 11; // 十进制
x= 0x11; // 十六进制
只有这两种方式,不能用二进制的串来描述一个数!
所以C51中,我们只能用十进制或十六进制来描述。
虽然有时候二进制描述起来更方便,但是C51语言是在C语言的基础上发展而来的,而C语言主要是用于计算机上编程的,而不是针对单片机编程。
3、顺序之位
0101,1010b为什么是 5AH,而不是A5H呢
这个里面又存在了顺序的问题,一个序列,我们通常最习惯的是从左往右看!
但是有人也会从右往左看,那么我们就需要明确出来,到底要怎么看。
这也是个规则D7D6D5D4D3D2D1D001011010
知乎的这个表格竟然最多只让插入8列,我发现我好难!
我还不能压缩它的宽度
它的规则我一点都不懂,所以我没法正常的使用它!
这个规则规定了,最左边是最高位,最右边是最低位。
所以 高四位是 D7D6D5D4,低四位是D3D2D1D0。
所以 0101,1010b的十六进制描述是5AH
4、半字节、字节、双字节、四字节
每8个位构成一个单元,称之为字节。每4个位构成一个单元,称之为半字节。
每16个位构成的单元,是2个字节,也是称之为双字节
每32个位构成的单元,是4个字节
每64个位构成的单元,是8字节
每128个位构成的单元,是16个字节
不同字节数,单独能描述的范围是不同的,所以以前32位的Windows系统它的最大内存是受限制的。4G可以了解一下。
为了更方便的描述更大的数据,又发明了
Kb = 1024个位
KB = 1024个字节
MB= 1024K个字节
GB = 1024M个字节
TB = 1024G个字节
1024的来源是10位二进制数,也就是2的10次方,是1024
5、顺序之字节
位有顺序,字节也有顺序!
多字节的顺序也是从左往右,从高位到低位来描述的!
这个更符合人们的习惯!
之所以提这一点是因为我们人的表达没问题,但是这些是需要另外一个东西来给我实现的
那就是单片机或计算机!
所以产生了大小端的问题!
6、数据的存储模式
数据的表达方式都明白了,我们人可以听,可以看,可以想想,这些不存在任何的障碍!
但是当这些数据是在单片机中或计算机中时,那么我们的沟通对象就变了!
这些机器没有眼睛,没有耳朵,没有想我们人一样的器官能很好的跟我们人来沟通!
我们必须用它们被设计出来时固有的方式来跟他们沟通!
1、地址
那么什么是地址呢?
上面有几个格子,我们沟通的时候,我们可以用手指着说【这个格子】或那个格子!
但是当我们2个人不处于同一个位面的时候,当我们的沟通对象无法看到我们的手指向的时候,如何才能更好的更准确的表达出来我想说的那个格子呢!
我们还可以说,比如从上面数第一个格子,从上面数第二个格子!
这没问题!
但是这种表达很繁琐,我们需要知道方向,还要去数第几个
如果我把这个格子换个形式9876543210
那么我们仅仅需要说0号格子,1号格子就行了
而且绝对不会出错!
我们人眼睛可以看到这个格子的【号】,这个号在单片机里面的另外一个名字就是【地址】,英文单词Adress
那么【地址】也是我们人描述这些格子的一种方式,是描述的他们空间排布的方式。但是这些格子本身并不需要知道自己在哪里,虽然他们在空间排布上是有区别的,是有相互关系的。
所以我说【地址】是不存在的,意思是说虽然他们有区别,但是他们不需要弄一个标签贴在上面,来告诉别人我的【地址】是多少!
【地址】是人为的为了让自己更好的沟通才产生出来的一种描述方式!
地址从小到大,排列,我们把地址小的称之为【低地址】,地址号大的称之为【高地址】1、低地址在下面,高地址在上面2、低地址在上面,高地址在下面
通常大部分书籍或资料中,都会是采用第一种描述方式来绘制这个空间地址排布的方式
但是无论哪一种,都是一样的,因为图1和图2的地址序号也是【颠倒】的。
这也是一种规则!也是一种标准!
当这种规则和标准让大众认可了之后,也就是我们学会了之后,那么我们可以更好的沟通或表达自己!
2、容器
那么一个格子里面能存放什么呢?
一个位!位地址—–是原子地址,不能再次拆分了!也是最最基本的单位!
一个字节!字节地址 由8个位组成
一个双字节!16位地址 由2个字节组成,由16个位组成
一个四字节!32位地址
一个KB 1024个字节 1024X8个位
一个MB 1024 X 1024个字节 1024 X 1024 X 8个位
一个GB 1024 X 1024 X 1024个字节 1024 X 1024 X 1024 X 8个位…
。。。。。
那我也可以把整个世界,所有所有的东西都放进去! 需要多少个位呢?
包括看文章的你,包括你思维里面的所有都放进去!
我在把这个格子放到口袋里,因为我的口袋也是一个容器!
容器,能容所有!
3、把【数】放到【地址】里
虽然容器能容所有,但是那是我们的思维!
我们一个无穷大,一个无穷小,一个宇宙,就把所有所有的东西都涵盖了
但是,我们要把什么放到格子里面,还要看将来是谁来使用这个格子!谁来替我们处理这些数据!
是单片机或计算机这样的机器来使用这个格子!
那么单片机一次最多能处理多少位数据就决定了这个格子的二次基本单位
比如8位机:那就是一个格子里面可以是一个字节
比如16位机:那就是一个格子是可以是2个字节
比如32位机:那就是一个格子里面可以是4个字节
比如64位机:那就是一个格子里面可以是8个字节
但是无论我们怎么去描述它,怎么去分组,它还是会以它的最小单位来组成。
我们可以用位来描述,但是太复杂了,因为我们人的大脑可以很轻松的处理8位数据
所以我们可以采用我们最容易处理的方式来描述它
那就是一个格子里面就是一个字节!每个格子里面有8个位D7D6D5D4D3D2D1D0
上面的这个容器就是10个字节的空间,每个字节是8个位,共80个位。
我们习惯从地址从下往上开始定义,最下面为0,越往上地址数值越大,所以:
我们这个容器的描述就很清楚了!
最左侧的是【字节地址】。
而每个小格子里面的数字则是 【位地址】。
而当我们把位的细节描述忽略掉之后,变成了这个样子!字节空间
那么假如我有一个数是:1234H,这是一个双字节的数,我想把这个数放到格子里面去,我们需要几步呢?
【首先】我们需要【选定】一个地址!(因为我们的大脑很聪明,经常忽略掉一些细节,我们经常默认就是从最下面空白的区域开始,也就是图中的0地址开始存放,这是我们的习惯,也是我们的思维模式!这个过程我们的大脑甚至不需要思考,就把数据放到了0地址里面)
【其次】因为数据是2个字节,我们一次只能放置一个字节,那我们先放置高字节数据还是低字节数据呢?
按我们的习惯,先拿高字节数据,后放低字节数据。
那么,放置好之后,就是这样的一个样子,大端模式
从中我们能够发现
【高字节】数据—->【低地址】空间
【低字节】数据—->【高地址】空间
这个模式是我们最习惯的模式,暂且称之为【大端模式】!
但是我们还有另外一种存放的方法,和上面的刚好相反
【高字节】数据—->【高地址】空间
【低字节】数据—->【低地址】空间小端模式
虽然这里仅仅这么2种模式,但是很多人不容易记住,那么只需要记住一点就行,【小高高】!
即高字节存放在高字节区,就是【小端模式】非此情况,就是【大端模式】
4、地址的别名!
我们班里面每个人都有一个名字,比如张三,李四,但是学校那么大,为了防止重名的,我们又有了学号,
学号是唯一的。
学号就是【地址】
在同一个空间内【地址】必须是唯一的!
要不然我们就没办法唯一的去描述它!
那么我们的【名字】就是这个【地址的别名】,这一点很重要!
因为我们基本不喊同学的学号,而是喊同学的名字,甚至同一个宿舍的人在宿舍内还可以喊老大,老二!
那么为什么呢?
因为我们人希望用最少的符号(姓名包含姓和名,且一般是2到4个字)带给我们最丰富的信息,这也是我们的思维模式或思维习惯,或许是我们懒,或许是我们觉得2个字就足够了!
比如我们听到【阿美】我们下意识的知道她是女孩还很漂亮!听到【阿帅】我们下意识的知道他是个男孩还很帅!
虽然这样带来信息很丰富,但是我们的姓名就那么有限的几个字,我们美好又容易写容易记住的词又没有那么多,就导致了一个班里面可能有几个人的姓名可能都完全一样!
这种情况下,当2个人同时在的时候,我们可以在他们的姓名前加个“大”或者“小”字,来区分他们,而且他们也知道谁是大阿帅,谁是小阿帅!我们就解决了这个问题!
但是,单片机或计算机里面能做到吗?
做不到,因为他们仅仅知道【0】和【1】!
我们与他们的交流方式只能用【地址】,只是这个地址对我们人来说是枯燥的,我们很难一串数字浮想联翩!
怎么解决呢?
起个别名吧!
可是无论我们怎么起名字,这个名字起的多么优雅,多么动听,也是仅仅是满足了我们人与人之间沟通的习惯而已
这个名字最终还是要跟【地址】挂上钩!
从另外一个角度来讲,既然名字我们人用起来非常方便,我们人创造了那么丰富的语言和文字,使得我们人与人之间的沟通变得非常容易,那我们是不是也可以用这种方式来【间接】的与机器打交道呢!
我们是不是先描述自己的想法,描述完之后,在把他们按照机器的规则翻译成机器能识别的语言,进而跟它沟通呢?
这个翻译的过程可以自己手动来!
当然我们的机器既然能够处理输出了,那让我们的机器来翻译也未尝不可!
但是我们需要先有一套标准,让机器知道怎么翻译!
好吧!好吧!好吧!
5、汇编语言诞生了!
于是人们制定的翻译的规则和标准规范,这就是【汇编语言】
【汇编语言】是非常接近机器语言的,还是按照机器的运行方式来制定出来的语言,非常依赖运行它的机器!
所以【汇编语言】的通用性差,但是执行效率高!
我们需要有一个地方能够输入我们想描述的事情,那么汇编语言的【编辑工具】也就诞生了!
翻译工作既然是由机器来完成,所以需要开发一个工具来实现这个过程,那么【汇编器】变诞生了。
那么把【编辑工具】和【汇编器】整合到一起的工具,就是IDE,也就是集成开发环境!
渐渐的,人们又不满足了,因为在刚有计算机,刚有单片机的时候,他们的市场空间和发展空间太大了,每一个人都朝着那个无穷无尽的宝藏出发了。
于是各种不同的单片机,不同的汇编指令,不同的编辑工具和汇编器统统产生了。
谁也不想兼容谁,谁也不想跑在别人的后面,谁也不想把自己公开!因为利益太巨大了!
可是滚滚向前的车轮永远不会因为利益停下来,也或许是为了更大的利益!
天才们想着能不能有一种工具能兼容所有的平台,能在所有的平台上运行!
而把人从特定的机器上脱离开来。
我们只需要我们的想法,至于谁来实现,谁如何实现,其实不是我们最关心的问题!
在这个驱动下:
6、C语言诞生了!
先前的大能们通过非常多非常的实践,归纳总结出来了我们人让机器做什么,简单来说就是什么时候,什么条件下做什么事情,这个更简单点来讲就是【面向过程控制】,是一系列【过程】的【组合】!
所以这个C的本意是组合,但是C语言又是在BCPL基础上发展而来的,而BCPL又是在CPL发展而来的
CPL:Combined Programming Language。1963年英国剑桥大学推出
BCPL:Basic Combined ProgrammingLanguage。1967年由剑桥大学的Matin Richards在同样由剑桥大学开发的CPL语言上改进而来
B语言:1970年,贝尔实验室的Ken Thompson在BCPL的基础上改进出了B语言,用于书写UNIX。这个名字取自BCPL中的第一个字母。
C语言:1973年同样是贝尔实验室的D.M.RITCHIE将B语言进一步改进,并且取了BCPL中的第二个字母将其命名为C语言。
C既是编程语言从B版本升级到了C版本,又是面向过程的组合语言,它的重点应该是Combined!
那么从世界上第一台计算机ENIAC于1946年诞生,到1973年C语言诞生,经历了27年的时间。
这个时间段里面,解决非常非常多的问题,从30吨的ENIAC到1967年大规模集成电路的微型计算机
从最开始纸带到磁带到磁盘
从手工翻译机器码到汇编语言到C语言,光语言就出现了250种!
可以想象,现在是2023年!计算机的发展会是什么样子!
可以问一下,C语言为什么会统治全球!
7、C51中想声明一个变量到底需要知道哪些呢!
那就要看我们想表达什么样的意思!我们想告诉单片机或计算机,我们想让他们做什么!
而C51语言为了实现这些又定制了哪些规则,这些规则是标准和规范化的,是死的!
但是这里面每一个死的规定又是具有丰富鲜活的意义!是那么的优雅!
所以难吗?
不难,
当我们试图从0开始一点一点去回看历史,
去体验当时他们的绝望和喜悦的时候,
去体验他们永不满足,
永远不知疲倦的追求完美和极致的时候。。。。。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/96181.html