打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
计算机学习漫谈(8)——计算机眼中的数字世界

    从古至今,人类发明了很多数字的表示方法,比如罗马数字,中国数字,还有我们现在最熟悉的阿拉伯数字。而在计算机世界中,同样存在一种数字表达方法,而且这种方法和我们通常所熟悉的方法还存在比较大的差别。不管是罗马数字还是阿拉伯数字,我们使用的都是十进制。人类使用十进制来表达数字估计是和人类的生理结构有较大关系,因为不管是手指头还是脚趾头,我们都有10个。假如人拥有8个手指头或者16个手指头,估计我们现在使用的就不是十进制,而是八进制或者十六进制了。不过这只是猜测而已,好像没有科学证明。
  
  (1)二进制
  在我们所熟悉的十进制中,我们规定逢十进一。比如在幼儿园的小朋友学习数数时,从1数到10时他们会将他们人类天生的计数器——手指派上用场,而到了11时他们就不知道怎么办了?这时候老师就要教他们在纸上写上10,然后继续往下数。而在计算机里,它是没哟手指的,那它应该怎么去学习数数呢?人类已经帮他们制定好一整套方法了。首先,计算机虽然没有手指,但它们有电压。在任何电路中,都会存在两种状态,一个是通路,一个是断路,也可以表示成两点之间存在电压和没有电压两种状态。我们现在把有电压的状态用“1”表示,把没有电压的转台用“0”表示。于是,我们就可以建成一套有一连串“1”和“0”表示的数字体系了,这种方法就是做二进制数字表达法。
  一个二进制数是有一连串“1”和“0”组成的,比如00001表示的是十进制中的1,而00010表示的是十进制中的2。这里这个要么是“1”要么是“0”的符号单位称为一个“bit”,也就是“比特”或“位”。一个二进制用k个bit来表示称为这个二进制有k-bit宽度。在二进制中,我们规定“逢二进一”,就像我们十进制中“逢十进一”一样。这样,我们可以算出1个bit能表示2个数字,2个bit表示4个数字,3个bit表示8个数字,也就是K个bit表示2^k个数字。同时,我们还规定8个bit为一个字节,32位能同时表示4个字节。我们现在所用到的电脑大多数都是32位,也就是每个数用32bit表示。不过我们下面用到的例子多是8bit或16bit,这样就不用写那么长的一串1和0了。
  现在我们已经为计算机制定好用于表示数字的二进制,不过这对于计算机来说还远远不够,因为数据是有分类型的,如整数,小数,正数、负数等,我们还要给计算机规定好这些,它才能比较方便地进行计算。现在我们一起来看看几种常见的数据类型。
  
  (2)整数数据类型
  如果我们不考虑整数前面的符号,那么表达就容易多了。直接用二进制的方法表达即可。K个bit表示2^k个数字,8个bit可以表达2^8=256数字。然而在实际计算中,我们会用到大量的负数,这些负数如何表达呢?我们可以将2^k一分为二,一半表示正数,一半表示负数。但如何表示呢,我们伟大的辈们已经想好怎么去表达了。
  第一种方法叫作符号位法。这种方法是在数字前面留出一位来表示符号,“1”代表负数,“0”代表正数。于是,8bit中第一位表示符号,后7为表示数字,所以它能表示-128~+127。
  第二种方法叫做反码表示法。其方法是:将一个正数所有bit全部取反,即得到该正数所对应的负数编码,例如“+5”表示为“00101”,那么“-5”则为“11010”。
  不过这两种方法只是在早期计算机中应用,因为他们在硬件逻辑设计上都相当复杂。所以,我们需要设计更适合硬件操作的编码方案,这种方法叫做补码表示法。
  
  (2)补码
  在自然数中,绝对值相同但符号相反的两个数之和为零。补码就是按照这个条件要求来编制的。在补码表示中,如果已知一个非零整数A的编码,其相对应的负数的编码是“取反加1”,即把A的编码全部取反,然后再加上1。例如,如果数字1的编码为00001,则-1的编码是11110+1=11111。我们可以看到00001+11111=00000,正数与负数相加正好等于0.
    
  (3)数制转换
  我们人类所熟悉的十进制与计算机所用的二进制之间是如何转换呢?这里有一道公式,只要记住它,我们就可以很快地进行数制转换了。我们先来背背这个公式:“除2取余,逆序排列”。什么意思呢?我们做道例题就知道了。
  例1: 将89转为二进制
  解:   89/2=44……1,
             44/2=22……0,
             22/2=11……0,
              11/2= 5……1,
                5/2= 2……1,
                2/2= 1……0,
                1/2= 0……1
  答:89转换为二进制为1011001
  
  例2:将50转为二进制
  解:  50/2=25……0
            25/2=12……1
             12/2= 6……0
               6/2= 3……0
               3/2= 1……1
               1/2= 0……1
  答:50的二进制位110010
  
  二进制如何转为十进制呢?
  我们在十进制里有一个计数方法叫科学计数法。比如1000=1*10^3,200003=3+2*10^5
  在二进制里我们同样可以用这种科学计数法,因为它是科学的,所以是通用的。
  用上面的例子试试看:
  例3:将110010转为十进制
  解:110010=1*2^5+1*2^4+1*2^1=32+16+2=50
  答:110010的十进制是50。
  
  例4:将110010转为十进制
  解:1011001=1*2^6+1*2^4+1*2^3+1=64+16+8+1=89
  答:110010的十进制是50。
  
   通过上面的例题,我们可以很轻松的掌握十进制与二进制之间相互转换了。
   
  (4)算述运算
  二进制加法:在十进制里的加法,是每逢满十就前进一位,那以此类推,在二进制里的加法,就是每逢满二就前进一位。下面我们做道例题。
  例5:1+1=?;
  解:    1
         +   1
         =10
  答:1+1=10
  
  例6:3+3=?
  解:    11
         +   11
          =110
  答:3+3=11+11=110

  二进制减法:在二进制的减法中,只要先把减数通过补码方法转换成负数,然后两者相加即可。
  
  符号扩展
  在一些情况下,为了减少占用空间,较小的数值会采用较少的bit来表示或存放。例如,数值5如果按照16bit表示的话就是0000000000000101,可我们用6bit来表示就足够的,000101。这两种方式表达的内容都一样,但占用的空间就有较大差别了。但是,如果遇到一个6bit和一个16bit的数相加或相减,就会出问题了。例如13和-5相加,
  例6      0000000000000101
        +                           111011
        =    0000000001000000
  这样就变成了13+(-5)=64,这明显是错误的。所以,我们要把宽度较小的数字进行符号扩展,使得两个操作数的宽度相同。
  符号扩展的方法是正数前面添加0,在负数前面添加1。因为在二进制中,正数前提任意添加0是不会改变其值的,而在负数前任意加1也是不会改变它的数值的。
  
  溢出
  我们知道计算机表达数字是有一定的位数的,如我们所说的8bit,16bit,这也就说明计算机中能够表达的数目是有限的,如果让两个数进行相加,完全有可能得到的结果超出了计算机所能表达的范围,于是出现了计算错误,这就是溢出。
  例如,在5-bit码字的表达范围ieshi-16~+15。如果计算(+9)+(+11)的运输结果,
  例7    01001
          +01011
          =10100
  结果得到的是一个负数,这就是溢出错误。
  而两个负数相加,也有可能出现溢出错误,例如表达式(-12)+(-6),
  例8   10100
         +11010
         =01110
  两个负数相加变成了正数,这显然是错误的。
  上面的例子都是发生在相同符号数相加的情况下,而事实上,溢出错误是只可能出现在相同符号数相加的情况下。
  
  (5)逻辑运算
  数学运算出了算术运算之外,还存在逻辑运算。我们来看看二进制中的逻辑运算是怎么样的。
   “与”运算
   “与”运算(AND)的运算规则为两个操作数为1时结果为1,否则为0。
    A  B  AND
    0  0   0
    0  1   0
    1  0   0
    1  1   1
  
  
   “或”运算
   “或”运算(OR)的运算规则为两个操作数中任意一个为1时结果为1,否则为0
   A  B  OR
         0  0   0
         0  1   1
         1  0   1
      1  1   1
  
   “非”运算
   “非”运算(NOT)为一元逻辑运算,对操作数直接取反。
    A   NOT
        0    1
        1    0
  
   “异或”运算(Exclusive-OR)
   “异或”运算为两元逻辑运算,如果两个操作数不同时结果为1,相同时结果为0
    A  B  OR
        0  0   0
        0  1   1
        1  0   1
        1  1   0
   
  (6)浮点数
  用二进制表示数字时会有一个范围,即使是16bit的,也只能表示-2^15~+2^15-1。如果我们需要表示一个很大的数,如摩尔常数(6.023*10^23),用之前的方法就无法表达出来了。所以我们定义了另一种数据类型,叫做浮点数。
  浮点数就想到与我们常用的科学计算法,如6.023*10^23就采用科学计数法。在这种方法中,有三个组成部分,第一是符号,第二是尾数,第三是指数。在6.023*10^23中,符号是+,尾数是6.023,指数是23。在浮点数中同样也规定了这三个部分。IEEE标准中规定,浮点数由32bit组成,其中,第一位表示符号,中间八位表示指数,最后23位表示尾数。在二进制方式下,第一个非零数字只可能是1,所以这个1可以省略。
  我们举个例子,现在有一个数00111101100000000000000000000000, 第一个0表示这个数位正数,中间八位表示这个数的指数为-4,后面23为表示尾数为1.00000000000000000000000,所以,这个二进制数表示的是+1.00000000000000000000000*2^(-4)=1/16。
  我们不必对浮点数做过于深入的研究,我们只要知道浮点数可以表达很大的数就可以了。  
  
  (7)ASCII码
  (American Standard Code for Information Interchange,美国信息互换标准代码)在计算机中,所以数据都是用二进制来表示的。比如0代表0,1代表1,10代表2,以此类推。但这并不是唯一固定的,而是认为把他们匹配的。如果每个人都用自己的一套表达方式,那么计算机就不知道听谁的了。所以,大家就统一制定一个标准,这个标准就是ASCII编码
  ASCII编码规定:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符);32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字; 65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。 
  
  (8)十六进制计数法
  假设有一个16bit的二进制数:0011110101101110,如果让你在两秒中记住这个数,你能做到吗?
  估计很少人能够做到。不过,如果我们换一种写法,也许你就会觉得这是轻而易举的事情了。
  我们把16bit的数据分成四段,每段4bit。4bit可以表示16个数字,我们分别用0123456789ABCDEF这16个字符来代替。于是,0011=3,1101=13=D,0110=6,1110=14=E,也就是说0011110101101110可以表示成3D6E。这样子我们就很容易就能记住这个数字了。
  上面提到的这种方法叫做十六进制计数法,它的主要好处就是方便人们记忆和使用。
  
  通过上文的描述,我们已经在计算机眼中的数字世界逛了一圈,希望大家都有点收获! 
  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
二进制、八进制、十六进制,看完你就懂了
详解原码、反码、补码——深入理解补码
计算机原理之整数表示(原码/反码/补码)
位运算:按位与 &
(转)原码、反码和补码
定点数与浮点数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服