你的程序、打开的文本为什么老是乱码?先来认识一下世界的编码集

ASCII:因为最开始计算机是美国人发明的,所以最早的编码集只为美国服务,包含95个可打印字符,33个不可打印字符(包括控制字符)一共127个,而127个只需要7个bit就可以表示,为了以后拓展方便(后续确实也扩充了),最后定为8个二进制表示一个对应的字符,这也是1byte=8bit的由来,所以ASCII表中的每个值都是一个字节表示。如阿拉伯数字1就在表中的49位,用二进制表示就是00110001。

Unicode:随着互联网的普及,计算机走向了世界,原先的ASCII编码已经不再适用于每个国家,所以有了Unicode编码集,Unicode又称万国码,几乎包含了世界所有国家的符号和文字,而我们常用的UTF-8就是一字节为单位对Unicode进行重新编码的结果,在UTF-8中中文3个字节,英文只占1个字节。

GB2312:我们中国自己的编码集,被称作国标,共收录了7445个字符,包括6763个汉字和682个其他符号。而我们常用GBK是对GB2312的拓展,并向下兼容GB2312,在GBK中不论中英文都是双字节的。

那么现在来回答最一开始的问题,其实想一下就知道,一个UTF-8下的中文用GBK去反编码,3字节强制转2字节,自然就出现了乱码的现象,所以只要做到请求方和响应方编码的统一,也就不存在乱码现象了。

二进制:来自机器的自白,我的故事里没有你。

我们学习计算机的第一天,可能就有人告诉我们,机器只认0和1,也就是所谓的二进制,二进制和十进制一样,我们日常使用的十进制是逢十进一,而二进制就是逢二进一,那么为什么机器一定要用二进制呢?其实现代计算机使用二进制是历史的选择,你想要表示一个彩虹七种颜色,就需要一个能够表示七种状态的元件来完成,那么这个计算机就有可能是七进制的,现实世界中这种元件几乎没有,而能表示两种状态的电子元件比比皆是,而多种状态相应也会带来复杂性的几何倍数的升级,所以最后计算机的所有组件都选择了二进制的电子元件。

二进制与十进制的转换关系:以数字6为例,二进制就是110,也就是说6=0*2的0次方+1*2的1次方+1*2的二次方,那么十进制转二进制,还是以6来说,6/2=3余0,3/2等于1余1,1/2=0余1,将余数从右往左依次排列,就有了110.

二进制将计算机中的数分为有符号数和无符号数

无符号数:包含0在内的所有正数,默认正数无需符号

有符号数:在原码表示法中,二进制的首位是符号位,0表示正数,1表示负数

二进制编码的原反补移

原码:一个数的二进制表示就是原码,以数字5为例,配合符号位就应该是0,101

那么有了原码之后为什么还需要反补移呢?

反是指反码:一个正数的反码等于它本身,负数的反码就是原码除符号位以外按位取反,那么数字5的原码是0,101反码也是0,101,而-5的原码是1,101,反码就是1,010

补是指补码:一个正数的补码等于它本身,而负数的补码等于反码末位加1,也就是负数的补码等于除符号位以外按位取反末位加1就是补码,还是以5为例,5的原码是0,101补码也是0,101,而-5的原码是1,101,补码就是1,011

移是指移码:符号位取反就是移码,了解即可

总结:也就是说正数的原码=补码=反码,那么已知y补求-y补,只需要连同符号位在内按位取反末位加1即可。

那么回到最初的问题,为什么要引入原反补移?因为CPU中的计算单元,只有加法器,没有减法器,那么为了实现减法计算加法化,引入了补码和反码的概念

也就有了[A-B]补=[A+(-B)]补=[A]补+[-B]补我们举例说明

以5-6为例,想转换成加法,就是我们所想的5+(-6),按照原码去算不就行了吗?真的是这样吗?

注:第一个计算很可能就直接报错了

下面重点来了,这里只是简单的整数运算,但是我们工作过程中,既有整数又有浮点数,那么一个浮点数是如何存储和计算的呢?

定点数:小数点位置确定的数我们称之为定点数,定点数是与浮点数相对应的一个概念,也就是说整数和-1~1之间的小数都是定点数。

浮点数:那么小数点浮动位置不确定的我们称为浮点数,他们最终都可以被科学计数法表示。

浮点数的科学计数法的表示,有一个IEEE的标准,它定义了两个基本的格式。一个是用 32 比特表示单精度的浮点数,也就是我们常常说的 float。另外一个是用 64 比特表示双精度的浮点数,也就是我们平时说的 double。

单精度的 32 个比特可以分成三部分

第一部分是一个符号位(s),用来表示是正数还是负数。接下来是一个 8 个比特组成的指数位(e)。最后,是一个 23 个比特组成的有效数位(f)。我们用f来表示。综合科学计数法,我们十进制的科学计数法要求我们必须是1-10之间的数,那么浮点数就可以表示成:0.f乘以2的e次方的形式,然后再加上个符号位表示正负。

比方说,我们输入了一个十进制浮点数 9.1。那么按照之前的讲解,在二进制里面,我们应该把它变成一个“符号位 s+ 指数位 e+ 有效位数 f”的组合。第一步,我们要做的,就是把这个数变成二进制。

先把这个数的整数部分,变成一个二进制。9,换算之后就是 1001。接着,我们把对应的小数部分也换算成二进制。小数的二进制转换和整数相反,我们把小数点后的每一位,都表示对应的 2 的 -N 次方。那么 0.1001,转化成十进制就是:1×2^−1+0×2^−2+0×2^−3+1×2^−4=0.5625,相应的十进制转二进制也是和整数相反的,不断乘以二,然后看看是否超过 1。如果超过 1,我们就记下 1,并把结果减去 1,进一步循环操作。那么这里的.1,其实变成了一个无限循环的二进制小数,0.000110011。这里的“0011”会无限循环下去。

然后,我们把整数部分和小数部分拼接在一起,9.1 这个十进制数就变成了 1001.000110011…这样一个二进制表示,然后我们右移4位,表示成科学计数法就是0.1001000110011…×2^4,放到具体的内存中的表示就是

为什么要这么表示?这里重点需要看两个东西,第一个有效位,不管是什么浮点数总能表示成0.f乘以2的e次方的形式,所以这里把超出23位的有效位舍弃。然后重点是这里的指数位,按照我们的理解,指数位应该是4,也就是00000100才对,那么这里为什么是10000011?

指数e的情况其实比较复杂,首先,e为一个无符号整数。这意味着,如果E为8位,它的取值范围为0~255;如果e为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的e是可以出现负数的,所以IEEE规定,e的真实值必须再减去一个中间数,对于8位的e,这个中间数是127,我们在这里用 1~254 映射到 -126~127 这 254 个有正有负的数上;对于11位的e,这个中间数是1023。

比如,2^10的e是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

然后,指数e还可以再分成三种情况:

(1)e不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数e的计算值减去127(或1023),得到真实值。

(2)e全为0。这时,浮点数的指数e等于1-127(或者1-1023),有效数字f不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

(3)e全为1。这时,如果有效数字f全为0,表示±无穷大(正负取决于符号位s);如果有效数字f不全为0,表示这个数不是一个数(NaN)。

所以这里的4变成了4+127=131,即10000011。

那么相应的我们再把这个浮点数表示换算成十进制, 实际准确的值是9.09999942779541015625不等于9.1,所以大家都是9.1是你认为的,但是对于单精度浮点数和双精度浮点数来说,是两个数。

关于浮点数的加法:

浮点数的加法我写一个常用的十进制的科学计数法你大概就清楚了,比如说5.1×10^3 + 2.5×10^2 ,不看后边的指数,前边大家都是*.*的形式,但是因为指数的存在,就表示两者根本不在一个维度,那就先搞成一个维度,就可以变形为5.1×10^3 + 0.25×10^3,这样不就好算了,也就是等于(5.1+0.25)×10^3=5.35×10^3,而浮点数的二进制计算相对复杂亿点点,但是原理是一样的。

第一步:对阶,对阶的第一原则小阶向大阶看(因为有效位右移只损失精度),至少需要先让彼此处于一个平等的位置,指数位要先相同。那么没升阶1次,有效位右移一位,指数位+1,直到指数位相等。

第二步:有效数字相加

第三步:规格化,什么叫规格化,比如说上边的十进制科学计数法的例子,不是5.1×10^3 + 2.5×10^2,而是5.1×10^3 + 5.2×10^3,这时候不需要对阶,因为阶一样,但是位数加完之后是10.3×10^3,不符合科学计数法的写法,所以要进行规格化最后会写成1.03×10^4的形式,这种被称为右规,有效数字右移,有效位+1。

那么有右规就有左规,那么左规就是和右规相反,有效数字左移,有效为减1,直到符合规格化标准为止。两者有什么区别呢?什么时候用左规什么时候用右规呢?

左规有可能多次,因为阶位有可能存在巨大差异,而右规只有一次,因为溢出只会溢出1位。所以溢出用右规,其余用左规。

第四步:舍入,只有右规才需要舍入,0舍1入

第五步:溢出判断。对于浮点数来说,当有效数相加出现出现01. XXXX或10. XXXX时,并不表示溢出。因为可以通过右规使其不再溢出。

因此,浮点数的溢出判断是判断阶码的溢出。如最大11111111,再升阶就溢出了。但是全为0不会,只会无线接近于0,这就跟IEEE规范对应起来了

下图的尾数是指有效数字

我们以1.5+2.5为例比较好算

那么1.5的浮点表示就是0符号位 ,10000000指数位,110.....00有效位,即0.11×2^1

2.5的浮点数表示就是0符号位,10000001指数位,1010........00有效位,即0.101×2^2

1.对阶:对阶的第一原则小阶向大阶看(因为有效位右移只损失精度),那么1.5的阶是小于2.5的,那么有效位右移一位,高位补0,指数位+1,也就得到了0符号位 ,1000000,1指数位,0110.....00有效位.

2.有效位相加:结果有效位1,0000....0

3.规格化:不符合规格化,多出来个1,需要右规,右规指数升阶

4.舍入:末位为0,直接舍弃

5.溢出判断:没有溢出

最后结果0.1*2^3 转换成十进制就是0.5×8=4=1.5+2.5。如果是减法,有效位相加过程以补码计算。

计算机组成原理(六)-浮点数存储和浮点数计算相关推荐

  1. 深入计算机组成原理(十五)浮点数和定点数(上):怎么用有限的bit标识尽可能多的信息?

    在我们日常的程序开发中,不只会用到整数.更多情况下,我们用到的都是实数.比如,我们开发一个电商App,商品的价格常常会是9.9:再比如说,现在流行的深度学习算法,对应的机器学习里的模型里的各个权重也都 ...

  2. 深入浅出计算机组成原理04:存储和IO系统

    目录 1. 存储器层次结构全景 1.1 关于Cache 1.2 访问层次 1.3 不同存储器访问延时与成本 2. 局部性原理 2.1 时间局部性 2.2 空间局部性 2.3 局部性原理使用实例 3. ...

  3. 计算机组成原理六单元答案,计算机组成原理第六章中央处理器(含答案)

    第六章 中央处理器 6.1 CPU组成与功能随堂测验 1.控制CPU内数据通路传送的部件是( ) (单选) A.程序控制器 B.时序产生器 C.指令译码器 D.操作控制器 2.下列可能是CPU组成部件 ...

  4. 计算机组成原理 — 输入输出系统 — 存储控制器接口类型

    ATA(IDE) ATA(Advanced Technology Attachment, 高级技术附加装置)起源于 IBM,是一个单纯的磁盘驱动器接口,不支持其他的接口设备,适配的是 IDE(Inte ...

  5. 【计算机组成原理】数据存储的大端和小端

    在存储数据时,数据从低位到高位可以从左到右排列,也可以从右到左排列.因此,无法用最左或最优来表征数据的最高位或最低位,通常用最低有效字节LSB和最高有效字节MSB来分别表示数的低位和高位. 现代计算机 ...

  6. 计算机组成原理浮点规格化,规格化浮点数

    本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 规格化浮点数又称格式化输出,是指把一个浮点数按指定的格式进行转换.通常在报表统计展示.数据计算存储时需要格式化,常用的格式化函 ...

  7. 计算机组成原理_存储系统结构

    计算机组成原理总目录 存储系统结构 1. 存储系统的层次结构 存储系统的层次化结构图如下: 除此之外,存储系统的层次结构还可以分为以下两个层次 [Cache--主存]:用于解决主存与CPU不匹配的问题 ...

  8. 计算机组成原理课件蒋本珊,计算机组成原理(蒋本珊)教师用书

    内容简介: 计算机组成原理(蒋本珊)教师用书 目 录 CON TEN TS 第1章 概论1 1 .1 基本内容要求1 1 .2 误点疑点解惑1 1 .主机1 2 .单总线2 3 .完整的计算机系统2 ...

  9. 【计算机组成原理】流水线式指令执行

    文章目录 前言 一.处理器的构成 二.数据通路 1. 流水线工作 2. 冒险 3. 流水线寄存器 三.FPGA相比于CPU的速度优势 总结 前言 最近在阅读<计算机组成与设计 硬件/软件接口(原 ...

最新文章

  1. [导入]日志 20071206 (WCF Architecture)
  2. 【二维树状数组】See you~
  3. 《系统集成项目管理工程师》必背100个知识点-64采购文件
  4. exchange系列(四)如何保护exchange邮件服务器的安全
  5. 怎么查看计算机一共多少文档,不打开Word文档如何查看文章有几页 -电脑资料
  6. iOS UIlabel文字排版(改变字间距行间距)分类
  7. 封装不同类模板的随机数生成器
  8. C语言和其他高级语言的最大的区别是什么?
  9. 前端学习笔记之强制类型转换
  10. 整除光棍 (20 分)
  11. 远程控制软件 mRemoteNG,管理多台虚拟机
  12. 数据-第7课-线性表的顺序存储结构
  13. 网络技术——网络安全技术
  14. 计算机硬盘突然只有一个c盘,win10硬盘消失了只剩下c盘怎么恢复_win10硬盘突然消失只有c盘解决方法-win7之家...
  15. 社交网络电影计算机分析,基于社交网络的电影票房分析--以豆瓣电影和新浪微博为例...
  16. KEIL MDK5 更好用 更简洁 的ARM开发环境
  17. 《思维力:高效的系统思维》读书笔记05 - 快速提升你的沟通表达能力
  18. 台式电脑键盘错乱会出现计算机模式怎么办,键盘错乱怎么修复错位(台式电脑键盘按键错乱)...
  19. 使用Intel NCS2 算力棒 安装部署记录Windows 10, Intel openvino_toolkit_p_2019.1.148
  20. 神医“大数据” 甘做幕后英雄

热门文章

  1. IC研发常用英文术语缩写
  2. SDNUOJ 1213.金额的中文大写
  3. ubuntu上网问题以及ping通网络设备
  4. 靠手机软件免流是真的吗?什么原理?
  5. 第十一届蓝桥杯大赛软件类决赛 C++ B组 题解
  6. 家庭装修拆除时需要注意哪些事情
  7. 扒完外卖优惠卷,我好像学到了高效获客的套路!
  8. idea中actiBPM插件生成png文件 ,右键xml文件没有Diagrams
  9. 联合国成立区块链联盟以求应对气候变化
  10. 深圳创凯电子公司多视频底图像素叠加