大家好 欢迎来到C++程序设计 这一讲我们要给大家介绍一下信息的表示与存储 那麽首先我们先来看一下什麽是静位技术值 那麽我们都知道 计算机在处理数据的时候 一定要使用01这种二星质代码 那麽为什麽计算机要使用01这种代码 而不使用我们人类比较熟悉的十进制来进行编码呢 那麽我们说二进制有三个优点 第一个优点就是 物理上容易实现 可靠性高 什麽意思呢 就说明我们物理上的很多元器件都有两个稳定的状态 比如说我们电压有高电压 低电压两个状态 晶体管有导通和截止两个状态 那麽电容有充电和放电两个状态 所以我们用二进制的两个符号0和1 来表示物理元器件的两个稳定的状态是比较适合的 因此我们说物理上容易实现 可靠性高 那麽二进制的第二个优点就是运算简单 通用性强 那麽二进制的运算法则跟十进制是很类似的 那麽十进制是逢十进一 二进制是逢二进一的 所以它的运算法则相对来说也比较简单 那麽最后一个就是二进制便于表示和进行逻辑运算 我们知道逻辑运算有两个值 逻辑的量都有两个值 就是真与假 或者说是与非 那麽二进制的两个符号0和1 正好可以表示我们逻辑量的这两个值 所以用二进制来表示逻辑运算也是比较方便的 那麽综上所述这三个优点 所以我们说计算机採用二进制 而不採用其他进制的原因就在于此 好 那麽下来我们看一下进位技术制的特点 那麽第一个特点就是採用进位的方式进行技术 好比我们的二进制它是逢二进一的 十进制是逢十进一的 我们表示的这个时间是60秒等于1分钟 60分等于1小时 那麽它就是逢60进一的 另外就是我们的进位技术制採用的是位值表示法 那麽什麽叫位值表示法呢 我们通过十进制来举例 比如说十进制的123.45 那麽我们可以写成1乘以10的二次方 加上2乘以10的一次方 再加上3乘以10的零次方 再加上4乘以10的一次方 再加上5乘以10的负二次方 那麽这就是位值表示法 好 那麽这种位值表示法 我们要分解出进位技术制的数字的几个因素 那麽首先我们这是一个十进制 那麽十进制的乘以10的几次方 这个10就是它的基数 十进制的基数就是10 然后十进制的数码指的就是十进制有几个符号 那我们知道0123456789十个符号 所以它的数码就是有十个数码 那麽再有就是我们这块这个次幂 这个次幂就是我们的这个全 对吧 那我们所谓的位值表示法就说 比如说这个位置我这个1表示的其实不是1 表示的是100 因为它后面乘的是10的二次方 那麽下一个位置的2表示的也不是2而是20 那麽这就叫做位值表示法 好 那麽下来我们来看一下计算机中常用的数字系统 我们将来编程的时候常用的这个进制 就是二进制 十进制 八进制和十六进制 那可能有同学要问了 说二进制计算机要用 我们当然要学 那麽十进制我们比较熟悉 肯定也要学 那麽为什麽还要学习八进制和十六进制呢 因为我们知道二进制写的这个数字很长 一大串的0和1 我们很难快速的判别出来它到底的值是多少 所以我们在编程的时候 往往用八进制和十六进制来作为二进制的一个简写 因此我们这还有必要把八进制和十六进制也了解一下 好 那麽下来我们一个一个看 那麽二进制它的进位规则就是逢二进一的 那麽它的基数就是2 基本符号也就是数码有两个0和1 那麽它的全就是2的某个次幂 这时候它的基数就是2了 对吧 2的某个次幂了 那麽如果我们表示一个数是一个二进制的数的话 我们就要用大写字母B来表示 就是可以在这个数后面加上一个B 表示我这个就是个二进制数 那麽十进制它就是逢十进一了 它的基数就是10 然后它裡面有十个基本符号0到9 然后它的位全就是10^s 用大写字母D来表示是进制数 那麽八进制数是逢八进一 它的基数是8 它的数码是01234567 这麽八个 然后它的位全就是8^s 用大写字母O来表示八进制 那麽十六进制就是逢十六进一 基数是16 那麽十六进制的数码有16个了 那麽分别是0到9是10个 然后ABCDEF有6个 那麽这个大写的A就相当于是我们十进制的10了 然后B就是11 以此类推 那麽用大写字母H来表示十六进制 那麽这就是我们经常要用到的四个进制 大家需要有所了解 好 那麽接下来我们来看一下 各个进制之间的一个转换关係 那麽就包括如何把十进制数转换成其他进制数 如何将其他进制转换成十进制 还有就是二八十六进制之间的一个相互转换 那麽首先我们先来看十进制转换成其他进制 那麽这还我们以二进制举例 我们要将一个十进制的123.45 把它转换成一个二进制数 怎麽转换呢 那麽它这个转换比较複杂 要分成两部分进行 就整数它是一个转换规则 小数又是一个转换规则 那我们先看整数123是怎麽转换的 那麽它的转换规则就是除而取馀法 那麽这个r就是你要转换成的这个进制的基数了 那麽现在我们要转换成二进制数 所以这个r就是2 所以我们现在相当于就是一个除二取馀法 那我们看是怎麽取的 用123除以2得到的商是61 然后馀数是1 这个馀数我们要把它记录下来 把这个1记录下来 就是我们最上面放的这个1了 接著61除以2 商是30 馀数又是1 把这个1也记录下来 30除以2 商是15 馀数是0 15除以2 商是7 馀数是1 7除以2 商是3 馀数是1 3除以2 商是1 馀数还是1 那麽到了1除以2 这时候商就变成0了 馀数仍然为1 好 那麽除到什麽时候为止呢 除到商为0的时候就可以停止了 那麽得到的这一长串1和0 我们怎麽排列呢 我们说最先取得的这个馀数是排列在最右边的 最后取得的这个馀数是排列在最左边的 所以最后整数部分我们就转换成了1111 011 好 接著我们再来看小数部分 那麽小数部分採用的法则是乘R取整法 那麽二进制 这个R就是2了 所以我们将这个小数部分和2进行相乘 那麽0.45和2相乘得到0.9 那麽取它的整数位 那麽整数位是0 把这个0就取走了 好 那麽接著用0.9乘以2得到1.8 再取它的整数位1 把1也取走了 那麽1取走了以后 这R就只剩下0.8了 所以0.8乘以2就是1.6 然后再把这个1取走 0.6乘以2是1.2 然后把1再取走 0.2乘以2是0.4 然后把0取走 0乘以2得到0.8 再把这个0取走 那麽乘到什麽时候为止呢 那麽一直乘到满足你的精度要求了就可以了 比如说我们要保留小数点后面的6位小数 那麽这个时候我们就可以停止了 那麽取得的这些整数怎麽排列呢 最先取得的整数排列在最左边 最后取得的整数排列在最右边 因此我们123.45转换成二进制 就变成了1111.011100 好 那麽这就是十进制转换成其他进制的一个方法 那麽将来如果转换成八进制或者十六进制 只需要把R改成8或16就可以了 好 那麽下来我们看一个例子 比如说我们要做一个计算 十进制的计算就是128-5=123 对吧 那麽现在我们可以把它转换成一个二进制来进行计算 那麽二进制的计算法则跟十进制是一样的 但是要注意的就是它是逢二进一的 对吧 比如这个例子裡面 我们两个数相减 最低位相减 那麽上面这个0不够减 那麽从上面借一位 那麽借过来就是两个1 两个1减去一个1得到一个1 然后再接著倒数第二位 只剩下一个1了 再和0相减得到一个1 那麽倒数第三位还仍然保留著一个1 和1相减就是一个0了 那麽剩下的这几位 它都变成1了 所以减下来都是1 那麽最高位的这个1就已经被借走了 所以最后相减的结果就是1111011了 好 那麽下来我们再来看一下 其他进制是怎麽转换成十进制的 那麽转换的规则其实就是我们前面建构过的那个位置表示法 就是将我们这个多项式给它按全值来进行一个展开 就得到了 比如说我们二进制的一个数我要转换成十进制 怎麽转换呢 就转换成1乘2的5次方 注意这个时候它的这个奇数是2了 因为我们这个是一个二进制数 然后乘以5次方 因为从小数点左边开始数012345 所以乘以2的5次方 好 那麽同理加上0乘以2的4次方 加上0乘以2的3次方 以此类推 那麽最后相加的结果就是十进制的37.75了 那麽这就是其他进制转换成十进制 那麽如果是八进制和十六进制转换成十进制呢 我们只需要把这个底数把它改成8或者16就可以了 好 那我们再看看二八十六进制之间的一个相互转换 那麽比如说我先看一下八进制 这个二进制是怎麽转换成八进制的 转换成这个十六进制的 那麽我们说一位的十六进制数 正好对应于四位的二进制数 所以我们可以用一个很简单的一个方式 就是以小数点为中心 向两边发散四位为一组来进行分组 所以对于整数部分就是 从右向左数 这四位是一组 然后这四位是一组 然后这两位是一组 那麽不够四位的在左边补0就可以了 然后把它分好组以后 正好四位的二进制数对应一位的十六进制数 我们只要查一下那个对应表就可以了 比如说0011对应的就是3 1010对应的就是大写字母A 然后0101对应的就是5 所以直接转换就可以了 那麽小数点右边是以从左向右来进行分组的 所以就分成了这麽两组 同样不够的地方在右边补0 然后对应的就是第四 所以转换成十六进制就是3A5.D4了 好 那麽同理二进制转换成八进制 我们说一位的八进制数对应于三位的二进制数 所以我们从左向右分组的时候是以三位为一组的 那麽分完组以后同样查一下那个表 查一下对应表001对应1 110对应6 然后就转换成八进制的1645.65了 那麽如果是八进制和十六进制相互交换怎麽办呢 那麽我们说只有通过二进制为调量来进行转换 是比较快的一种方式 比如说我这是一个十六进制数 我先查对应表将7对应成0111 将F对应成1111 这样就转换成了八位的二进制数 然后再进行一个分组 以三位为一组进行分组 然后分完组以后 再查八进制和二进制之间的一个对应表 那麽就转换成了八进制的177了 那麽这就是各种进制之间的一个相互转换 那麽这一讲我们就先讲到这裡