初识计算机

    xiaoxiao2023-12-02  164

    要我在技术性博客上写些东西真的很有挑战性。我也研究了蛮久的实验,不过因为水平有限,很多技术方面的见解我都没有,甚至连一个有价值的问题都提不出来,基于这种情况,可能我写的内容心得体会占据的篇幅会比较多,希望能给和我一样初入门的新手一些鼓励和经验。 准确来说,我进入计算机领域也就3个月时间。这3个月我零零碎碎学了不少新东西,从刚开始看代码一脸茫然到现在有了一知半解,进步是很明显的,当然背后的曲折也是令人记忆犹新。 还记得上的第一节课就是深入理解计算机系统,当时我们上课用的PPT是全英文的,这让我有点激动,一瞬间觉得很高大上,与国际接轨,但接下来却是连着两节课一脸懵逼。从那时起,计算机领域给我的感觉就是水很深,我要走的路还很远。有了这样的认识,我即刻开始了我的求知路,以致于我的生活大部分时间都在追赶,变得有点乱糟糟。这样的生活状态持续了最初的一个月,在我补完一些基础知识后,我上课开始能跟得上了,生活节奏才放缓下来。不得不说,高压的学习状态是很辛苦的,从早到晚也让我有了回到高三的感觉,大学的学习也是不轻松的,我开始有了这样的见解。 之后吧,知识不断积累,我开始也有了一些自己的见解,也开始看得懂一些实验。相比之下,数据结构课程涉及到的一些实验我更容易理解。我们做了线性表、队列、堆串、二叉树、图等相关方面的实验,从中我对代码的理解也不断加深。比如,我开始知道数组不能直接赋值、必须通过遍历来赋值,数组的首地址就是它第一个元素的地址等等。而在计算机系统这门课程中,我更多的是对计算机底层的一些了解。就像刚开始我不知道机器当中只有01序列,我总认为长长的代码就是实现我们目标的直接途径,却不曾想还要经历编译、汇编等过程。当然我也遇到了许多难以理解的瓶颈。比如,show-bytes,我总是无法像看懂数据结构实验那样看懂这个实验,很多的字符我都没有见过,即便在老师的指引下我知道它想要执行的操作,却还是没有办法将每一句代码对应到它所干的事上去,只能简单的依据结果判断大端还是小端存放。另一个难点就是汇编,汇编的一些指令,寄存器的寻址方式都是一些重难点。接下来我会借助一些代码来具体讲讲我的困惑。 这是一段由机器代码翻译回C语言产生的结果,我们需要判断的是,y/M对应的由下列代码所确定的M值是多少。

    int t= x; x-=t; if(y<0) y+=7; y>>=3; return x+y;

    从代码入手,我发现y的除法运算是通过移位运算来实现的,左移3位,那么表示M=8,但是令我不解的是在这之前y+=7是个什么意思。7不是2的整数倍,应该怎么也扯不上关系才对,怎么糊里糊涂出来一个这样的式子。我苦思冥想了好久,直到后来在慕课上面听了南京大学袁春风老师的课,才知道除法运算在被除数是负数的时候,为了避免出现误差,需要加上一个偏移量,即2^k-1。 再说说有关浮点数的问题,首先是浮点数的表示方法。以IEEE的32位表示法为例,分为规格化和非规格化两种方式。两种方式相同的是,第一位为符号位,紧接8位为阶码,后23位为尾数。不同的是,非规格化的阶码域全为0,得益于此,它就可以表示一些特殊值,例如+∞、-∞和“NaN”。所以,一些我们生活中难以实现的运算计算机就可以实现。例如∞-∞=NaN。有了这些知识的积淀,我应该算是蛮了解浮点苏了吧,不过接下来我又遇到难题了。3.0/2=3/2?不过是吧3.0换成3而已,等式应该还是成立的啊,结果却令我大吃一惊,甚至感觉十几年的数学白学了。原来,浮点数表示的精度范围和整型不一样,对于3.0/2机器结果是1.1,而3/2机器运算结果确是1,1≠1.1,等式自然不成立。 诸如此类的问题还有很多,每当我认为自己应该掌握了一些知识,可实际解决问题时却发现我还有很多盲区。渐渐的我明白了,计算机的知识,是庞大而又细微的,量很多然而东西却很细节的,需要在理解的基础上加以不断实践。就拿我自己的经历来说,这几个月我觉得数据结构上机实验对我的学习帮助最大,通过写一些头文件,函数,类型定义,我能更好的理解代码的执行过程。所以说,我们这些码农根本的还是要多敲代码,本科阶段要想合格更是要敲上十万代码。 学习的路还在不断继续,我相信不久的将来,我一定能看懂技术大牛们的实验代码,自己也能够写一些这样的技术性话语,成为一名顶尖的科技人才。也希望入门的新手们,要敢于正视自己的不足,没有人一开始就是大牛,也没有说计算机就是智商高的人搞得东西,只要努力就会改变知识的现状。

    最新回复(0)