《中小学生Python编程入门指南》 附录一

附录一


    1、我们日常使用的数字进制是十进制,也就是“逢10进1”,就是我们数数,从0数到9,到了10就又变化了,又是从0开始。一样的,二进制顾名思义就是“逢2进1”,从0数数,0、1、10、11、100、101...以此类推。我们可能比较常用的还有十六进制数,比如说我们在用Photoshop等图片编辑软件或者其他用到颜色编辑的工具时,时常会看到类似于“#12d54f”之类的表示方法,其实这六位数值就是对应了我们“三原色”RGB,也就是Red(红)、Green(绿)、Blue(蓝),每两位代表一种原色,使用的就是十六进制,就是使用数字0到9,还有字母a到f,两位数值正好表示0到255。常用像“#0000ff”表示蓝色,“#ffffff”表示白色,“#000000”表示黑色。

我们怎么看懂二进制的大小呢?换句话说,二进制怎么转化成十进制来理解呢?

举个例子,比如说有一个8位的二进制数“01011011”如下,转换为十进制的,应该怎么转化?

二进制数的每一位数都是2的几次幂,就像我们的十进制一样,0是10的0次幂(100),10是10的1次幂(101),100是10的2次幂(102)。上述“01011011”对应每个位置的幂数如下:

二进制数转化十进制就是每个位所代表的数值和每个位的数值相乘后相加,也就是:

(27 * 0) + (26 * 1) + (25 * 0) + (24 * 1) + (23 * 1) + (22 * 0) + (21 * 1) + (20 * 1)

因为整数乘0等于0,乘1等于本身,那么上述计算可简化为:

26 + 24 + 23 + 21 + 20  = 64 + 16 + 8 + 2 + 1 = 91

也就是说,我们只需要计算数字为1的位所代表十进制数的和就可以了。

那我们知道了二进制转十进制,那十进制如何转二进制呢?我们可以使用求余的方法计算,比如刚才的91,如下图:

由下往上将余数组合起来就是“1011011”,前面补0凑齐8位就是01011011。

2、二进制的运算规则。

十进制的计算规则我们都很清楚了,那么二进制又是怎么计算的呢?其实是有规律的,因为只有0、1两个数,规则就简单很多:

加法:0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 = 10(进1位)

减法:0 - 0 = 0, 1 - 0 = 1, 1 - 1 = 0, 0 - 1 = 1(借1位)

乘法:0 × 0 = 0, 1 × 0 = 0, 0 × 1 = 0, 1 × 1 = 1

除法:0 ÷ 1 = 0, 1 ÷ 1 = 1(0不能为除数)

看起来很多,其实细看一下,跟十进制是一样的,只不过是“逢2进1”的区别,我们可以举例看一下,比如使用1001和0101的四则运算如下图所示:

二进制的运算,一般比较少用到,更为常用的是与、或、非、异或的运算,规则更为简单:

与:1 & 1 = 1, 1 & 0 = 0, 0 & 1 = 0, 0 & 0 =0(其实就是0和任意数字做与运算都为0,与的符号为&)

或:1 | 1 = 1, 1 | 0 = 1, 0 | 1 = 1, 0 | 0 = 0(1和任意数字做或运算都为1,或的符号为|)

非:~1 = 0, ~0 = 1(其实就是取反,反过来了,非的符号为~)

异或:1 ^ 1 = 0,1 ^ 0 = 1, 0 ^ 1 = 1, 0 ^ 0 = 0(相同的为0, 不同的为1,异或的运算符为^)

3、我们学了2.1节之后就知道数值有整数和浮点数之分,整数的存储我们比较好理解,就是通过二进制的存储方式来存储十进制。但是如果有负数我们应该怎么存储呢?所以整数可以分为有符号数和无符号数。

有符号数:计算机将存储的最高位用来作为符号位,最高位为0,表示正数,最高位为1,表示负数。

无符号数:将全部位数用来表示数值,没有符号位,不能表示负数。

我们知道了计算机存储整数的方法,那么计算机做整数运算的话该怎么计算呢?

举个例子,如果计算1 - 1的话,按照我们已知的计算方法应该是如下计算:

1 - 1 =  1 + (-1) = (00000001) + (10000001) = 10000010 = -2 ≠ 0

这显然是不正确的。为了解决这个问题,整数又分了三种编码方式:原码、反码、补码。

原码:在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数,其余位表示数值的大小。

反码:正数的反码与其原码相同。负数的反码是对其原码逐位取反,但符号位除外。

补码:正数的补码与其原码相同,负数的补码就是对该负数的反码加1。0的补码为0。

【从定义可以看出,正数的补码,反码,原码相同。0的补码就是本身。那么负数的原码和补码如何转换呢?已知一个负数求补码方法:绝对值原码按位求反加1。已知负数补码求负数方法:符号位不变,其他位按位求反加1。】

反码能解决上述问题吗?我们再算一下:1的反码为000000001,-1的反码为11111110,计算如下:

1 - 1 = 1 + (-1) = (00000001) + (11111110) = 11111111 = -0

1 - 2 = 1 + (-2) = (00000001) + (11111101) = 11111110 = -1

结果都是正确的,但是又有一个问题,0是没有+0和-0的区别的。

我们在看一下补码的计算:

1 - 1 = 1 + (-1) = 00000001 + 11111111 = 00000000 = 0

1 - 2 = 1 + (-2) = 00000001 + 11111110 = 11111111 = -1

结果都是正确的,显然,计算机使用补码来存储和计算是比较方便的。

在Python里面,整数是无限大的,理论上内存多大,整数就可以多大,所以int类型的数据没有范围,但是如果在C语言中,int类型则有一些受限,比如是在32位的电脑中,int占32位,取值范围为-2147483648~2147483647(-2^32~2^32-1)。如果超出范围怎么办,那就有“溢出”的风险,比如说4位范围的数,最大已经到了1111,如果这个时候再加1,则会变成10000了,而程序只能读4位,该数值就变成0,我们称为溢出。C语言更为关心计算机底层,所以编写C语言则需要格外小心。C语言还有long类型和long long类型,来表示更大的数值范围。在python2还有long类型,在Python3里面就没有了。我们可以更关心我们的编程逻辑而不用担心更加底层的问题

4、知道了整数的存储和计算之后我们再聊一下小数,其实不是所有小数都叫做浮点数,浮点数是一种表示数字的标准,整数也可以用浮点数的格式来存储。小数的表示方法除了浮点数还有定点数,区别就是小数点能不能“浮动”,浮点数的小数点在逻辑上是不固定的。

浮点数可以用一个表达式来表示:V = (-1)s × M × 2E

我们来逐个解释一下:

符号(sign) :1个bit表示,当s=0,V为正数;当s=1,V为负数。

阶码(exponent) :E的作用是对浮点数加权,用于存储科学计数法中的指数数据,并且采用移位存储。

尾数(significand) :M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M<2。(和十进制中范围为1~10一样)

一般在编程语言(如C语言)中浮点类型一般是采用单精度(float)和双精度(double)来存储,float数据占用32bit,double数据占64bit。在python中是使用了双精度来存储float,没有double。

十进制的科学计数法我们比较熟悉了,比如说:123.5用十进制的科学计数法可以表示为1.235×102。但是计算机用的是二进制,123.5换算成二进制就是1111011.1,用二进制的科学计数法表示就是1.1110111×26

这样看,我们在浮点数的内存存储,只需要存3个部分,也就是符号、指数和尾数。符号位我们知道1bit就足够了,指数和尾数多大比较合适?IEEE(电气和电子工程师协会)就制定了一些标准,单精度float 遵循的是IEEE R32.24,双精度遵循的是IEEE R64.53。在内存上的存储如下图:

对于尾数M,我们可以看到取值范围是1≤M<2,总是可以表示成1.xxxxx的形式,前面的1是固定的,所以IEEE就另外规定了,在保存M时,前面的1隐藏起来,要读取时再添加回去,这样就可以节省1位,就相当于有24bit的尾数位。224=16777216,因为107 < 16777216 < 108,所以单精度浮点数十进制的有效位数是7位。

而我们计算也能得知,双精度十进制的有效范围是15位。我们在python中验证一下,python的float有效精度是有16位的。如下图:

怎么回事?其实就是一个精度损失的取舍问题,当我们计算机在计算无穷数的时候,能取到17位但17位一般不准确,第16位大概率是准确的,所以就取数到16位。16什么时候会不准呢?如下图,当我们计算小数时是有可能发生最后一位数值出错的问题的。所以仅能保证到15位,但是15位还要依赖于16位的舍入,单精度也是一样的道理。这个问题我们要知道,但是不深究了,细说起来就很多了,有兴趣的同学可以上网查一下浮点数精度损失的相关介绍。

说完尾数M,我们再说一下指数E。我们上面只讲到正整数的指数,但科学计数法中,指数是有负数的,而E是一个无符号数,因为它没有符号位,于是IEEE又规定了,在保存真实E值时,E要加一个中间值。单精度情况下,E加127,双精度情况下,E加1023,这样负数也能存进来了。

另外,当E取值不同时,对整数值的计算方法也不一样,有下面三种情况。

① 当E不全为0,也不全为1时:

表示规格化形式的数字,按正常计算。此时E减去中间值得到真实值,M的整数部分按上面说的取值为1。

② 当E全为0时:

表示非规格化形式的数字,主要是0或者非常接近于0的数。此时E减去中间值得到真实值,M的整数部分取0。

③ 当E全为1时:

表示特殊值。如果M全为0,表示±无穷大(正负取决于符号s),如果M不全为0,表示这不是一个数(NaN)。

转载请注明来源:https://www.cnblogs.com/sunshinesky/

原文地址:https://www.cnblogs.com/sunshinesky/p/12343852.html

时间: 2024-10-01 02:35:46

《中小学生Python编程入门指南》 附录一的相关文章

《中小学生Python编程入门指南》1.2 Python是什么

1.2 Python是什么     Python语言是一种计算机语言,我们可以这样理解计算机语言.我们人类和计算机语言不通,所以需要中间介质,计算机懂的,我们人类也懂的,这就是计算机语言.Python只是很多种计算机语言中的一种.如果对编程这方面有了解的话,应该还会听过C.Java.C++.PHP等等计算机语言. Python这个单词翻译成中文就是巨蟒的意思,习惯来说,对于编程语言都是没有中文名的,直接用原名.其实不一定所以编程语言都是用英文编写的,还有用中文编写的,但很少人用,比如易语言,就是

《中小学生Python编程入门指南》2.1 设计开发一个计算器

第二章 设计自己的第一个Python应用 1.1 设计开发一个计算器 这一节我们来尝试实现完成一个计算器的应用.毕竟我们是初学者,不可能做得那么完美,也不是真的需要实现,只是想借这一个应用的理解,我们带入一些python的教学和其他的计算机相关知识. 我们先想想,计算器我们需要什么功能?先不想象多么只能的计算器,我们要先实现简单的会加减乘除的就可以了.那么我们就知道了,计算器是要有会加减乘除计算的功能的.那除此之外呢?我们想一下计算的流程,其实就是三个部分组成:①输入.②计算.③输出.好,那我们

《中小学生Python编程入门指南》3.1 运算符

第二章 Python的基本语法 3.1 运算符 什么是运算符呢?其实很简单,我们数学上学习到的加减乘除就是运算符,还有前面学习到的赋值语句"等于号"也是运算符.很多高级编程语言会将常用的运算符设计成一样,像Java.C.JavaScript等等,常用的运算符基本上一致,可以降低学习的成本.而且运算符是十分常用的,所以一般都会设计得比较简便且容易理解,以提高编写效率.下面列举Python得运算符,这些也不用特意去记,用着用着就记得,不记得就多查查,多看几遍就记得了. 1.Python的运

《中小学生Python编程入门指南》1.3 安装环境

1.3 安装环境 Python是一种开发语言,是需要编译这种语言的工具的,只有编译成我们电脑懂得语言,电脑才能执行我们得python语句,我们一般都称为软件开发环境(Software Development Environment,SDE),我们可能还听过IDE(集成开发环境,Integrated Development Environment),这是涉及比较专业的开发工具,有兴趣的同学可以了解,本书还是主要侧重于基础知识的普及. 我们本书演示用的操作系统是Windows 10系统,当然,如果使

《中小学生Python编程入门指南》 1.1 什么是编程

原文地址:https://www.cnblogs.com/sunshinesky/p/12297274.html

编程入门指南

前言 如今编程成为了一个越来越重要的「技能」:作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容:作为创业者,技术创始人的身份则会让你的很多工作显得更容易.而作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始:入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步:你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目:你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么. 这篇文章的内容对此不仅会有一些方向性的建议,

《编程入门指南》个人实践、感受与总结

0.<编程入门指南>原文:http://zhuanlan.zhihu.com/xiao-jing-mo/19959253?_client_version=6.5.8 虽然已码过不少代码了,毕竟本科不在CS,担心自己的学习不够系统.偶然看到这篇入门指南,觉得写得很不错,对于入门而言也很系统并且并不简单. 以下是个人实践和总结,不定期更新…… 启  蒙 1 (v1.3). 完成 Codecademy 的 Python 部分. 内容简单,闯关性质让人很有动力继续做下去,大概一两个晚上就可以完成,内容

Python编程入门到实践 - 笔记(1,2章)

自学 Python 有段时间了,总是觉得自己基础不牢,想着把看完的两本基础书写个博客做个笔记啥的. 准备在重新看一遍<Python编程入门到实践>,坚持写博客笔记. Python编程入门到实践的前两章笔记,学习的内容如下: 查看当前环境中的 python 版本 python环境的搭建 变量和变量的命名 字符串的打印 修改字符串的大小写 制表符和换行符 删除空白字符 python的整数运算,计算平方,立方 使用 str() 函数 查看当前环境中的 python 版本 命令行下输入 python 

Python编程入门(一)

Python编程入门(一) ========================================================================================= 概述: ========================================================================================= 编程语言 1.脚本编程语言 ★脚本编程语言 如php,perl,python,java等为脚本编程语言,