zoukankan      html  css  js  c++  java
  • 计算机的本质与数值、文字、声音、图像

    计算机的本质——二进制编码和布尔运算

    仅会某种编程语言是没有任何意义的,还必须学会一些完成实际任务的框架、库、包的使用。但是要想做到对一些库包的使用不仅仅停留在“知其然而不知其所以然”的层次,必然有些基础知识需要掌握。最基础的就是对计算机体系结构有基本的了解,不管是冯·诺依曼结构还是哈佛结构,他们的基础都是二进制序列+布尔运算。 也就是说所有被计算机处理的东西----指令和数据----都需要转换成由0和1组成的序列,而计算机功能的完成靠的就是将这些二进制序列按位经过一系列的与、或、非运算来实现的,而与、或、非运算很容易转换成逻辑电路的连接。也就是说一个任务要想被CPU完成,必须要进行编码转换和处理转换,编码转换就是对数据进行二进制编码,而处理转换就是找到从输入二进制到输出二进制之间的布尔运算步骤。

    CPU的最基本的指令——数值计算指令、跳转指令、存取指令

    计算机最早开发出来就是用作数学计算(加、减、乘、除、布尔逻辑)的,而要完成数学计算必然需要另外两个功能----指令控制、数据存取,指令控制就是控制指令按顺序执行或者按条件跳转,数据存取就是将外部存储中的数据读取到寄存器,将寄存器的数据存入到外部存储。这就是CPU最基本的功能,对应到CPU 的指令就是数学计算指令、跳转指令、存取指令,为了优化某些计算还提供了移位指令、位翻转指令等。其实考察现在计算机能够完成的工作,他们都可以转换成数学计算和存取的组合。 也就是说一个具有了数值计算指令、跳转指令、存取指令、移位指令、位翻转指令的CPU就能够完成所有现在强悍的CPU能够完成的工作。有人或许会说现在的CPU显然不仅包含这几种指令,一点没错!不过我要告诉大家的是,那些其它的指令都是存储在CPU里的由这些指令组合而成的小程序,称作例程,当执行那些指令的时候把CPU内部存储的例程载入到运算单元进行执行。另外还要告诉大家,数学计算指令中的乘、除实际上是加、减指令组成的例程,浮点数的计算指令是多个整数计算指令组成的例程。

    关于CPU的原理,可以阅读一下这一系列文章继电器是如何成为CPU的

    整数、浮点数的二进制编码

    既然计算机最核心的功能是数学计算,那么必须把数转换成二进制的编码。显然二进制本来就是数的一种表示方式,数的二进制编码的工作就剩下在机器中的二进制存储方式约定了。大家很快就达成了一致,将数分为无符号整数、有符号整数、浮点数三种。整数有8位、16位、32位、64位四种宽度,浮点数有32位、 64位两种宽度。其中无符号整数编码自然数,使用原码存储。有符号整数编码整数,最高位规定为符号位,其中负数使用补码存储,自然数使用原码存储。浮点数 的二进制存储方式并不是那么自然,那个小数点在机器里没法直接表示。所以用了科学计数法的表示方式,规定该表示方式由小数点左边一定是1的一个二进制小数 乘2的n次方组成。既然小数点左边是1,那么这个1和小数点就可以不要了,只存这个小数的尾数部分、指数n和符号。标准IEEE R32.24规定32位浮点数使用1位存符号,使用8位有符号整数存指数,使用23位有符号整数存尾数;IEEE R64.53规定64位浮点数使用1位存符号,使用11位有符号整数存指数,使用52位有符号整数存尾数。需要记住的是按照这种编码之后的数是需要直接传递给CPU指令的,所以数是计算机硬件(CPU)能够直接识别并使用的一种编码数据,并且是唯一的一种

    二进制小数只能表示很少一部分十进制小数

    二进制的小数是没法表示所有十进制小数的,这个随便找个分母不是2的n次方的能够转换成有限小数的分数来验证一下,验证方法就是把这个小数转换成二进制 的。当然还可以通过逻辑思考验证一下,十进制小数表示能够把1分成10的n次方之一份然后占据其中的m份,而二进制小数只能把1分成2的n次方之一然后占 其中的m份,m和n都是正整数,显然成10的n次方和2的n次方不是等价的。10的n次方之m中所有不能约分到成2的n次方之m的分数都是二进制不能表示 的,10的n次方等于2的n次方乘5的n次方,只有5的n次方能够被约掉的才能使用二进制精确表示。再考察浮点数的存储要求“小数点左边一定是1的一个二进制小数”,这就完了!0.0这个小数都不能精确表示啊!只能表示成1.0*2^-128或者1.0*2^-1024。有了这个概念就会在做有数学计算的编程时,先把公式化简再计算。这么大的存储误差,是不是计算的步骤越多,最后的误差越大啊!

    计算机能处理的只有数(数值、文字、声音、图像)

    现在的计算机能处理的数据看似多种多样,考察本质,其实就只有数、文字、声音、图像。文字、声音、图像又都使用数进行了编码。

    图像是用数进行编码的

    图像的本质是不是色彩块的集合啊?关于色彩,通过研究发现可以使用XYZ三个数来联合表示,叫做色彩空间,但是到底用那三个变量,因为不同的需要制定了 RGB、Lab、YUV、HSI、HSV等表示方式。其中YUV是RGB的变换形式,他们能表示的颜色范围是一样的,YUV是为了兼容黑白和彩色显示系统 提出的。YUV还有另外一个作用,因为人眼对亮度的感知灵敏一些,而对色度的感知迟钝一些,直接降低色度的空间采样率对人眼来说是没有区别的,空间采样率 表示单位面积内的采样点数。到目前为止计算机还都是人在用,人对色彩的感知只有细微的差别,色盲除外,不可能一个人看着是红色另一个看着是绿色,所以虽然 有不同色彩空间,但是他们之间都可以使用一个数学公式直接转换。除去人的细微感知差别,颜色其实是很客观的东西,颜色的本质就是电磁波的波长不同,所以即使有一天猴子也会用计算机了,色彩空间也很容易处理。

    声音也是用数进行编码的

    声音的本质就是机械波啊!声音怎么转换为数字呢?那就记录各个时刻的机械波的振幅就可以了啊,这样一记录频率是不是就隐含在里面了呀。时间是可以无限细分 的,真的记录各个时刻是不可能的,实际情况是每间隔一段时间采集一次,只要保证波形看起来还是原来那个样子就行了。人耳朵能听到的最高频的声音是 20KHZ,那么采样频率只要高于20K就能听到最高(尖细)的声音,实际中要想有不错的音质效果最低需要44K的采样频率。从这个原理上可以看出数码的声音在采样时都是有损的,而老式的唱机直接用刻刀在唱片上刻出了波形,这个是无损的、完全采样的。振幅只影响声音的响度,所以振幅是不是没有必要按原来的长度单位精确记录啊。一句话,只要保证波形看起来还是原来那个样子就行了,播放声音的时候调扬声器啊,想听大一些声音就把振幅调大。

    文字还是用数进行编码的

    最麻烦的就是文字呢!这玩意完全是主观的产物啊。文字是为了表意而人为规定的符号,这个符号不光指可视的,还包含可听的。因为让声音再现的技术发明的太晚 了,但是从植物中揉出一些汁水在石板、兽皮上画出一些可视的形象就能保存很久,所以古人为了让表达的意思传递下去,首先给文字制定了可视的形象。可视的形象和可听的声音,都是人的感知,这玩意具有不唯一性,要是用图片和声音的方式为文字编码,那同一个文字就可能有无数个编码,这显然不利于计算机处理。

    所以 对文字的编码,就是让一个文字对应一个确定的整数。某种对应关系的集合就是文字的一种编码。这种对应关系的制定,一开始,不同国家不同机构各制定各的,结果就是同一个数字在不同编码中表示不同的文字。所以你用这种编码存储了一段文字然后用另外一种编码打开,看到的结果完全不同,甚至很多文字看不到了;因为某种编码里面有的文字,另一种编码里很可能就没有。

    常见文字编码的关系

    在我国最常见的编码有ASCII、GB2312、GBK、GB18030、 UNICODE。这几种编码中后四种都是兼容ASCII的,GBK兼容GB2312,GB18030不兼容GBK,UNICODE兼容GB18030。兼容表示字符数量少的编码中的所有整数在另一种编码中代表相同的文字。这些编码中有些只规定文字和整数的对应关系没有为存储考虑,尤其是UNICODE。 UNICODE中最大的数需要4个字节的整数来存储,如果规定每个文字都用4个字节存储,那么有一篇文档的绝大多数文字都可以用不超过2个字节的整数来表示的话,是不是很浪费存储空间啊!此外随着UNICODE中收录的文字增多,甚至需要超过4个字节的整数来存储。所以针对UNICODE又制定了一些存储的编码,像utf-8,utf-16,ucs-2都是UNICODE的存储编码。现在流行的utf-8制定时考虑的是存储英文字母多的文档时要节省空间, 存储汉字时占用的空间比GBK多,甚至可能比直接用4字节整数存储汉字的UNICODE编码还多。没办法啊!谁让计算机是说英语的人发明的,标准是说英语的人制定的,唉!看到没,文字以及文字编码的制定是很灵活的东西,你甚至可以发明一种文字,制定出一套编码,给你老婆写情书用。

  • 相关阅读:
    SQL语句 分页实现
    PHPexcel入门教程
    json_decode返回null,使用echo json_last_error(); 返回4
    配置mysql可局域网内访问
    thinkphp5.0安装composer安装topthink/think-captcha
    linux下mysql忘记密码怎么办
    centos7 设置mysql账号密码开放3306端口实现远程登陆
    高级数据结构第七章A . 数列(树状数组逆序对)
    高级数据结构第六章E . 苹果树 (dfs+树状数组)
    高级数据结构第六章C . 奶牛狂欢节(两个树状数组)
  • 原文地址:https://www.cnblogs.com/tgis/p/4717584.html
Copyright © 2011-2022 走看看