什么是计算机思维?2个简单表达式让你理解!

0 前言

本文以十进制整数为例,使用2个最简单的表达式char a = -20;char c = a + b;,为你深入浅出地讲解计算机思维,力求将抽象的计算机思维具象化讲解,同时,我将为你描述一个宏大的计算机世界的蓝图


计算机思维与核心思想概要:

  • 人类世界与计算机世界的通道:编码与译码
  • 计算机处理信息的本质:二进制信息的运算
  • 现实世界向计算机世界的映射:二进制信息运算的原则
  • 人类与计算机斗争的胜利与妥协:分而治之、抽象思想与分析程序行为、分工协作

为了避免内容的冗杂,本文只谈及十进制整数和二进制数,力求使用最浅显易懂的知识,讲清楚高深的计算机思维

1 人类世界与计算机世界的通道:编码与译码

本小节,从最简单的十进制整数与二进制数的相互转化,来解释编码与译码

1.1 一段简单的C语言代码

你需要使用VS 2017进行单步调试和查看内存。

补充链接:使用VS 2017进行单步调试和查看内存

这里我们用char代表能够存储一字节大小的机器数的容器,并不使用其字符的功能。
存储1字节
你可以想象,这是一个char类型的容器,能够存储8位二进制数

以下是我们即将展开讲解的C语言代码:

#include <stdio.h>
#include <Windows.h>int main() {char a = -20;unsigned char b = -20;system("pause");return 0;
}

1.2 查看变量的内存情况

首先,我们查看一下数据ab在内存中的情况,这个时候,计算机已经完成了十进制整数到二进制的转换,内存中存储的是对应的二进制信息,通常采用十六进制表示。

变量a在内存的情况:
内存
变量b在内存的情况:
内存
如果你不知道如何查看变量地址的话,可以通过C语言中的&a&b,输出到控制台来查看。

我们可以看见,不管是带符号的变量a还是不带符号的变量b,将-20赋值给它们,存储到内存中的,都是十六进制的ec,也就是二进制的11101100

这里表明,计算机是先将-20转换为11101100,然后再放入变量中的。

我们查看一下【局部变量】:
局部变量
这里表明:

  1. a和b的二进制信息是完全一样的
  2. 他们输出到屏幕的数据类型和十进制数值不一样的

这是为什么呢?

1.3 计算机编码:从十进制到二进制

我们再看下面的图
转换

首先,我来解释一下从通过键盘输入存储存储器的过程

  1. 从屏幕键入-20,计算机先进行编码,变成了二进制的11101100
    编码
  2. 再将二进制信息,存储了变量a和b中。其中,变量a和b分别是带符号和不带符号的char类型数据
    两个盒子
    这里有两个不同颜色的盒子
  • 它们分别代表char类型和unsigned char类型
  • 他们分别被打上了标签ab
  • 他们都存入了二进制信息11101100

1.4 计算机译码:从二进制到十进制

下面我来讲解一下,从二进制信息输出十进制的过程。

尽管a和b两个盒子中的二进制信息完全一样,但是你要清楚,这只是在计算机世界完全一样,在人类世界中,二进制信息的含义应该是:二进制信息的含义 = 位 + 上下文,所谓上下文,就是二进制信息所处的环境。

参考学习:《深入理解计算机系统》的1.1节

也就是说【11101100 + 数据类型】,通过这两个条件,才能正确得到现实世界中,二进制信息的含义,这里我们将二进制,以十进制形式进行输出。

转换

  • 对于变量a,以带符号的十进制形式输出,因为它被转换为二进制之前,就是带符号的十进制数。
  • 对于变量b,以无符号的十进制形式输出,-20以补码形式转换成二进制数,然后再存入b中,此时这个二进制数的含义发生了改变,因为它的上下文从带符号数变成了无符号数。

这里我们需要强调的是,对于十进制与二进制的相互转换,大多情况下,是怎么进去的,就要怎么回来,除非特殊需求,比如需要将十进制数转换为字符输出,这也是允许的。

1.5 小结

本节我为你展示了两个过程

  • 十进制 --> 二进制,这个过程叫编码
  • 二进制 --> 十进制,这个过程叫译码

编码与译码

计算机的外部设备,鼠标、键盘、音响和显示器等等,这些都是从人类世界进入计算机世界的入口

人类通过这些外部设备输入信息(十进制数、文字、图片、视频、音频……),由计算机进行编码,以二进制数的形式进入计算机世界,你也可以理解为入乡随俗

这些二进制数在计算机的世界里遨游,有些二进制数是数据,有些是指令,这些指令是计算机世界的指挥者,他们指挥着数据工作,这些数据可能进行加法工作,可能进行乘法工作……

当这些二进制数,完成了他们的探索使命,就要回到人类世界,这个时候,他们将会通过计算机进行译码,恢复他们在人类世界的本来面貌。

虫洞
你可以想象,一架宇宙飞船,从人类世界,通过虫洞进入计算机世界,在完成任务后,又通过虫洞返回人类世界。

2 计算机处理信息的本质:二进制信息的运算

2.1 体验计算机的二进制运算

我们把上一小节的代码,再加上一行代码char c = a + b;

char a = -20;
unsigned char b = -20;
char c = a + b;

我们查看一下内存和局部变量:
内存
内存
可以得知,变量c对应的十六进制是d8,二进制是11011000,又因为它是char类型,因此二进制信息对应的十进制信息是 -40

这里你是不是有疑问?试想,如果是按照十进制进行相加-20 + 236,肯定不等于-40,并且,一个char类型的数和一个unsigned char类型的数据,不同的数据类型相加,又是怎么进行的呢?

这里,也就可以谈及我们的要点信息处理的本质,是二进制信息的运算。我们所有的信息,都是先转换成二进制信息,再进行相关运算,运算结束后再根据其上下文,返回对应的结果。
人类世界与计算机世界
我们根据这个过程,再来审视一下刚才的例子:

  1. ab的内部是二进制信息,将它们进行加法运算,得到结果
  2. 将结果放进容器c
  3. c中的二进制信息,再由计算机译码,转换为十进制输出到屏幕

转换

如果我们将最后一条加法改成unsigned char c = a + b;,c的结果将会是216,具体过程留给读者思考。

需要注意的是,这里我举这个例子,只是为了说明本文的观点,事实上,C语言编程中,非常不建议将无符号与有符号数混合运算,因为那样得到的结果很可能令人费解,可能也没有什么现实含义。

2.2 小结

本小节为你讲述了这些内容:

  1. 对于char a = -20;,计算机先将-20以补码的方式转换为二进制信息11101100,在将其放入变量a所对应的内存中。
  2. 对于char c = a + b;,计算机会在CPU中,会进行如下过程
    1. 将a和b的二进制信息进行加法运算
    2. 将得到的结果放进变量c所对应的内存中
    3. 再转换为十进制显示到屏幕上

二进制代码
在计算机的世界里,只有二进制数,这些二进制数,在计算机世界中,按照人类设定的规则不断地运算,完成任务后,又以原本的身份回到人类世界。

这,就是计算机处理数据的本质,计算机按照人类设定的规则进行二进制运算

推荐阅读《编码:隐匿在计算机软硬件背后的语言》

3 人类世界向计算机世界的映射:二进制信息运算的原则

计算机是人类发明的工具,是人类智能的延伸,因此,计算机世界的运算法则,要遵从人类世界的运算法则,才能更好地为人类服务。

例如人类世界中,1+2 = 3,那么在计算机世界中,0001 + 0010也要等于0011

无论是加减乘除法,还是其他种种,都有遵循这个原则,这样人类才能更方便地利用计算机解决现实问题。

因此,二进制数本质上就是现实世界在计算机世界的映射,它具备现实世界的含义。他们之间实现映射的通道是编码与译码

我给出你一个表格,做个对比,让你清晰地感受这种映射

人类世界计算机世界
领导者控制器
基层员工运算器
能源物质数据

给你解释一下:

  • 控制器在CPU内,能够指挥计算机怎样工作
  • 运算器在CPU内,能够进行数据的运算
  • 数据在计算机存储器(内存、硬盘等)中四处游走

给你推荐一个动画,能够让你清晰感受到:人类是高维生物,而计算机世界是人类创造的一个新的世界,这个世界是人类世界的映射,它为人类世界工作和服务

推荐动画:《瑞克和莫蒂》第二季第六集:电池微世界

4 人类与计算机斗争的胜利与妥协

自从计算机被发明以来,人类与计算机一直在进行着永无休止的斗争,不断进行着碰撞与融合

计算机是人造的产物,它是人类思维的产物,但是随着它的不断发展,其复杂性成指数级上升,独立的个体已经很难去控制它,因此,为了充分利用计算机来为人类造福,人类又发明了很多方法去控制它,去约束它。

计算机诞生以来,形成了很多的分支领域,也诞生了很多优秀的理论,这些都让人类能够更好地控制计算机,为人类造福,例如软件工程中的瀑布模型及其衍生模型、敏捷开发方法;又例如当今时代的火热技术人工智能、大数据;又例如面向未来的量子计算机……

人类在这场没有硝烟的战争中,有胜利,也有妥协

4.1 人类的胜利

人类在这场战争中,充分发挥自身的智能,成功地使用分而治之的哲学思想逻辑抽象的数学思想,战胜了复杂的计算机!

4.1.1 分而治之思想的应用

根据本文的核心理念,这里我只使用文章开始提及的简单表达式,来为你讲解分而治之思想的实际应用,然后给到你该思想的本质内核。

对于表达式char a = 3;,我们可以将其分开看待

  1. 3转换为二进制,看作0011
  2. char看作某种类型的容器
  3. a看作容器的标签

这样,你就可以将这个表达式看成:将0011放进贴着标签achar类型的容器中。

放入容器

这个简单问题,可能没有让你感受到复杂问题的简化,你可以想象一个需要你解决的问题:让你开发一款操作系统,这个问题足够复杂,但是其开发过程的各个环节,都渗透着分而治之的思想,我想你应该清楚它的重要性了。

该思想能够让复杂性问题简单化,让很难被解决的问题得以解决,事实上,人类面对大规模问题,都会采取这样的思想:软件工程的分工协作、硬件编程的层次建模……它有大量的应用场景,这个思想对读者来说,是年金,它每年都会给读者分红,时间越久,利息越多

4.1.2 分而治之思想的本质

Divide et impera ——拉丁语,意为“分而治之”,引自Machiavelli的一句政治箴言,1532

分而治之的思想本质,就是拆解与转化

  • 将大问题拆解为小问题
  • 将小问题拆解为更小的问题
  • 将更小地问题转化已知的被解决过了的问题

Critical thinking(批判性思维)的相关资料指出:所谓创造,就是将已知的产物以全新的方式结合起来。

而分而治之的思想,正是通过问题拆解,转为已知,再综合结果的方式,实现了创造

切开的蛋糕
如果蛋糕太大一口吃不下,那就先切开它!然后一快一快吃下它!

期待你遇到大规模问题不要惊慌失措,你可以先拆解他、再转化它、最后综合起来,几乎任何问题都可以被解决。

4.1.3 抽象与实现

逻辑抽象是人类智能的体现,它是计算机所不具备的,面对一个复杂的问题,我们可以对其进行不同层次的抽象、建模,这些行为的进行,可以在人的脑子中,也可以在纸面上,或者在其他工具上。

根据抽象得到的结果,人类再使用计算机这个得力助手去实现它,这样就能真正地解决现实问题。

计算机领域的抽象与实现,可以是 [数据结构] 的抽象数据类型;可以是 [Verilog HDL] 的层次建模思想;可以是软件工程的UML建模……

抽象与实现
抽象与实现的思想,其实渗透到了人类生活的各个领域,期待你能够以这样的方式去重新审视这个世界。

4.2 人类的妥协

人类不会向计算机屈服,但是面对一些挑战,也不得不做出适当的妥协让步,这也是为了更好的应用计算机高效率地解决现实问题。

4.2.1 分析计算机行为快速搞定bug

当程序没有按照你预期的结果执行,不要懊恼,不要悲伤,更不要想着:“为什么它没有按照我想的去做?”

这样的想法,只会让你更加懊恼和沮丧,你应该想的是:是不是我哪里没有描述清楚,所以它没有做好事情?

你应该做的是:按照程序执行的行为,使用单步调试/断点调试,逐一分析,直到找到问题根源

计算机是个听话的孩子,它只会按照你告诉它的去执行,因此,如果它出错了,一定是你指挥失误,你只需要分析它的每一步行为,就能够以最快的速度找到错误,解决bug

这是计算机历史上,导致计算机崩溃的一只虫子(bug),让我们一起,按照程序的行为,找到它,消灭它!

4.2.2 大规模项目的分工协作

随着计算机的不断发展,大规模复杂问题开始出现,独立的个体可以写出一个小程序,但是面对大规模问题,人类就如同《焦油坑》里的动物一样,不断挣扎,但是越挣扎,反而越痛苦。
焦油坑
直到软件工程出现,人类开始学会分工协作,共同应对棘手的“焦油坑”,成立了“外科手术队伍”,具备了解决大规模问题的能力。

推荐阅读:《人月神话》
你将会更加直观地感受到人类与计算机的斗争,比如焦油坑、外科手术队伍……

5 期待你更好地在计算机世界遨游

本文从一个最简单的表达式出发,为你描述了人类世界与计算机世界的宏大蓝图;给你讲述了重要的计算机思维,并将其具象化表达;给你讲解了重要的破解复杂问题的方法和适当妥协让步的策略。

计算机是人类智慧的延伸,是人类得力的工具,是人类的 “外包大脑”,永远记住,你不是程序员,不要当程序员,你是解决问题的人你要利用人类特有的智能,这,才是你与计算机的不同,你能做到计算机做不到的事情,你要充分利用计算机这个得力工具去解决问题,不要被其反噬控制。

期待此文,能够为你带来全新的计算机世界观,让你更好地开启计算机旅程。


声明:

  1. 本文大部分图片均为自己制作,一些图片是我购买的具备个人版权的图片,还有极少数素材来源于网络,侵删。
  2. 本文中,部分的类比和比喻,伴有科幻主义色彩,非技术部分的内容可能并非严谨的科学事实,请勿恶意揣测,谢谢。
  3. 本文涉及的技术,为了方便你理解,采用了简化模型,并未展现完整的技术细节,技术细节你可以从我推荐的书籍中学到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程间通信————有名管道

有名管道 特点&#xff1a; 对应管道文件 可用于任意进程之间进行通信 打开管道时 可指定读写方式 通过文件I/O操作 内容存放在内存中 当读端和写端都不存在 管道内容自动释放 当读端和写端只存在一个 将会无法打开管道文件 管道文件大小永远为0 因为管道中的内容保存在内…

【汇编语言】8086汇编的loop循环与[bx]寻址(王爽第五章5.5节学习笔记)

计算FFFF:0 ~ FFFF:B单元中数据的和&#xff0c;结果存储到dx中 1 分析与解决 内存单元&#xff1a;字节型数据目标寄存器&#xff1a;dx&#xff0c;字型寄存器&#xff0c;不匹配数据范围&#xff1a;dx不会超&#xff0c;但是dl会超&#xff0c;因此必须用dx将字节型数据&a…

Linux下数据库(sqlite3)学习笔记

sqlite3 数据库安装 1. 本地安装 sudo dpkg -i *.deb 2.在线安装 sudo apt-get install sqlite3 3.使用压缩包解压 压缩包下载路径&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1xHLZGObQODUGBReNEi3KKQ 提取码&#xff1a;zjqv SQLITE3 基本命令 两种命令 1.以…

signal------SIGCHLD

因为笔者之前的文章里面有错误&#xff0c;今天发现&#xff0c;立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时&#xff0c;我说调用wait函数要一直检测子进程是否执行完其实是错误的&#xff0c; wait是阻塞函数&#xff0c;当主进程调用wait函…

为什么要学习汇编语言?如何正确学习汇编语言?

汇编语言是计算机系统结构的接口&#xff0c;它介于软硬件之间&#xff0c;学习的时候&#xff0c;必须结合软件和硬件来学习。 1 向上结合高级语言 学习汇编语言的时候&#xff0c;不可孤立学习汇编语言&#xff0c;当今时代很少之间用到汇编语言编程&#xff0c;但是使用汇…

数据库Sqlite3

sqlite3 数据库安装 1. 本地安装 sudo dpkg -i *.deb 2.在线安装 sudo apt-get install sqlite3 SQLITE3 基本命令 两种命令 1.以 . 开头的称之为系统命令 .help 帮助 .quit 退出 .exit 退出 .databases 查看打开的数据库&#xff08;显示数据库的名字和路径&#xff…

【汇编语言】8086汇编,快速搞定各种寻址方式:立即数寻址 / 寄存器寻址 / 存储器寻址

0 前言 众所周知&#xff0c;对于8086汇编语言&#xff0c;有几大寻址方式&#xff0c;不过我觉得这个好墨迹&#xff0c;会用就可以了&#xff0c;为什么命名这么多&#xff0c;这次只说本质&#xff0c;不说命名&#xff0c;至于命名&#xff0c;还是得知道&#xff0c;毕竟…

【数据库】数据库基本概念:数据库管理系统 / 数据库 / 表 / 数据

0 前言 本文讲解数据库的最基本概念 推荐书籍&#xff1a;《MySQL 必知必会》 需要的软件&#xff1a;MySQL 8.0 1 数据库相关概念及其实战应用 1.1 数据&#xff08;Data&#xff09; 在人类世界中&#xff0c;数据可以是 数值型数据 十进制数 非数值型数据 图片声音视频文…

tiny4412初期环境搭建

花了整整三天 从跃跃欲试到失望 绝望 最后迎来曙光!!! 话不多说直接上干货 这些软件安装的具体过程网上有很多 在这里就不说了 1.在主机下 安装secureCRT软件和超级终端&#xff08;安一个就行 不过最好两个都安上&#xff09; 作用&#xff1a; 软件可以打印一些开发板信息…

vivado软件如何查看内部器件的仿真信号

有时候&#xff0c;我们需要查看内部模块的信号&#xff0c;那么&#xff0c;在vivado软件该如何操作呢&#xff1f; 运行仿真&#xff0c;可以得到这个界面&#xff0c;之后看左侧部分&#xff0c;可以查看内部的模块。 例如单击rom0 可以看见其内部信号&#xff0c;然后在想…

Vivado软件(用VerilogHDL)如何使用$readmemh和$readmemb函数

0 前言 博主我查了很多资料&#xff0c;虽然会使用Verilog的readmemh和readmemh和readmemh和readmemb函数&#xff0c;可是&#xff0c;在vivado软件中怎么用&#xff1f;文件放在哪里&#xff1f;没有一篇文章提及。 花了几个小时&#xff0c;终于研究明白了&#xff0c;特此…

【汇编语言】王爽实验5(5)(6)的解答 建立数据类型匹配的观念

0 前言 本文解答王爽《汇编语言》实验5的&#xff08;5&#xff09;&#xff08;6&#xff09;题 同时给出一些常见问题的解答 以及给出最易犯错的地方&#xff1a;数据类型不匹配的解决方案 1 题目解答 1.1 实验5&#xff08;5&#xff09; 1.1.1 题目 将data1和data2段…

【Java图文趣味版】快速搞定数组的声明、开辟空间和初始化赋值

0 前言 本文讲解java数组的基础知识&#xff0c;适合零基础小白。 1 数组的概念 所谓数组&#xff0c;就是一组同类型东西的集合&#xff0c;可以通过index&#xff08;索引&#xff0c;下标&#xff09;访问这一组东西的某一个元素。 就像下图这样&#xff0c;由于数组概念…

【java图文趣味版】数组元素的访问与遍历

0 前言 本文适合零基础小白。 本文接上一篇文章&#xff1a;快速搞定数组的声明、开辟空间和初始化赋值 重要的知识点 通过array index访问数组使用for each循环遍历数组使用Arrays.toString()方法打印数组 我们先创建一个数组&#xff0c;之后通过它来说明后面的知识。 …

【数据库】数据模型基础概念(图文版)

0 前言 本文通过一个实例&#xff0c;来讲解数据模型的基础概念。 要求设计一个数据库的数据模型&#xff0c;统计出你的宿舍每个人&#xff08;4个人&#xff09;的信息&#xff0c;要求包括 个人信息&#xff1a;学号、姓名、班级、年级、学院选课情况&#xff1a;学号、课程…

哲学家就餐(避免死锁)(多进程版)

哲学家就餐&#xff08;避免死锁&#xff09;&#xff08;多进程版&#xff09; 哲学家就餐利用信号量在多进程之间实现 下面展示一些代码片段 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <sys…

【汇编语言】数据类型的匹配问题:自动匹配与手动匹配

0 前言 本文基于8086汇编语言&#xff0c;不过x86系列语言具备向下兼容特点&#xff0c;大多数情况都可以用。 与高级语言数据类型的自动转换和强制转换一样&#xff0c;汇编语言的数据类型也有 自动匹配和手动匹配。 下面&#xff0c;我来介绍一下汇编语言的相关原则。 1 …

Qt制作定时关机小程序

文章目录 完成效果图ui界面ui样图 main函数窗口文件头文件cpp文件 引言 一般定时关机采用命令行模式&#xff0c;还需要我们计算在多久后关机&#xff0c;我们可以做一个小程序来定时关机 完成效果图 ui界面 <?xml version"1.0" encoding"UTF-8"?>…

Visual Studio 编译优化选项:Debug与Release、禁止优化与O1、O2、Ox优化

Debug与禁止优化 Debug模式是调试模式&#xff0c;会有很多冗余的调试代码&#xff0c;供开发者调试程序使用。 VS是默认使用Debug模式的&#xff0c;我使用的是VS 2017。 在Debug模式下&#xff0c;是默认开启禁止优化的&#xff0c;我们来查看一下 在左侧源文件的main.c处…