数据的范围 碎碎念

实际上该篇文章的定位还是蛮高的,就像计算机网路中的特殊地址一样,是不是几乎每年必考?在计算机组成这门课里,数据的范围通常会以小题的形式考察,但不排除例外,2017年408真题简直刷新了我的三观,原来数据如此有趣!这是2019年,表示考408的我有点惶恐。。

首先,我觉得有必要说明几个概念:

(1)真值:带“+”  “-”符号的数称为真值,真值是机器数所代表的实际值

(2)机器数:把“符号位” 数字化的数称为机器数,分别称为符号位,数值位,是在计算机中的表示形式

(3)无符号数:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值

梳理一下:假设数据现在以8位表示

无符号数:最小0000 0000=0     最大1111 1111=255     范围0~255

原码: 最小负数 1111 1111=-127    最大正数 0111 1111 =+127      范围-127~+127

               最小负数1. 111 1111=-(1-2^{-7})            最大正数0.111 1111=1-2^{-7}    范围 -(1-2^{-7})  ~(1-2^{-7})  

反码:最小负数 1000 0000=-127     最大正数 0111 1111 =+127         范围-127~+127

            最小负数1. 000 0000=-(1-2^{-7})          最大正数0.111 1111=1-2^{-7}    范围 -(1-2^{-7})  ~(1-2^{-7})  

原码和反码还需要注意的一点就是对于0 都有两种表示,而补码对于0的表示是唯一的,所以可以多表示一个负数。

补码 : 最小负数:1000 0000=-128          最大正数:0111 1111=+127   范围-128~+127

         最小负数 1,000 0000 =-1               最大正数0.111 1111=1-2^{-7}    范围 -1 ~(1-2^{-7})  

这里需要关注几个特殊的取值。1000 0000 补码表示为-128                   1.000 0000补码表示为-1

                                                   1111 1111补码表示为-1.

这里有没有看出问题? 对于-1 我到底是该把它看成整数还是小数呢?表示是不一样的!!!一定注意!

移码: 最小负数:0000 0000=-128          最大正数:1111 1111=+127   范围-128~+127

                        我们知道移码的表示和补码就是差了一个符号位,范围同补码。

                       我们说的移码加偏置值表现为正数,这里看上面的数很奇怪,没错的,它表现为正数,但是真值才是他代表的数。这样写的好处就是可以让我们直接观察二进制代码,知道哪个数的确是大的,此处是为了解决补码的缺陷。

在此对移码的说法进行小结:对于移码,假设n=8

                       真值(数值)表示范围:-128~+127

                        机器数表示范围:0~+255

浮点数:最大值: +\infty用阶码为255表示     最小值-\infty

             +0: 0000 0000 H       -0 8000 0000H

   正常情况下 最大的 数  2^{127}*(2-2^{-23})

                      最小的数2^{-126}

下面讨论一下数据的位数,这就是17年大题的命题点

(0)unsigned short:无符号数短整型:占16位

(1)unsigned int :无符号数整型:占32位

(2)int :整型,数据位占31位,符号位占1位

(3)float:浮点型32 位格式,有效位数为24 位,隐藏1位,相当于7位十进制有效数

(4)double:浮点型64位格式,有效位数为53位,隐藏1位,相当于17位十进制有效数

例1:source:天勤

分析:思维的问题,有的时候,你不能执着于将数真的用二进制代码表示出来,移码可以从补码的角度考虑,对于B选项,真值为-128,在求-x的时候发生溢出,是求不出结果的。所以本题你想用一个个列的方法不是一个好的选择。

例2:source:2017年真题

           

好吧,分析本题非常有挑战性,我尽力讲的清楚,相信这也是对我自己知识的一种巩固。

(1)在f1中其中定义了n 和i是无符号数,这就出现了一个问题:

  例:unsigned i,j   if(i-j<0)  实际上该条件是永远也不成立的,无符号数就是无符号数。

所以第一问中就是无符号数的0-1=1111 1111 1111 1111 1111 1111 1111 1111这代表无符号数的最大数,i又是小于等于号,所以循环条件永远成立,死循环。

当把i 和n都定义为int型之后,0-1的结果依然为1111 1111 1111 1111 1111 1111 1111 1111,但此时代表的是-1,此时条件不成立,循环体不会执行。

(2)f1(23)=24个1=  0000 0000 1111 1111 1111 1111 1111 1111=00FFFFFF H

      f2(23)=24个1=1111 1111 1111 1111 1111 1111=1.111 1111 1111 1111 1111 1111*2^{23}

          所以阶码的值应该为23+127=150 所以 机器数: 0 1001 0110 111 1111 1111 1111 1111 1111=4B7F FFFF H

所以返回值是相等的。这里问的是机器数,我们现在知道的是真值,所以需要将其表示成在计算机中的形式。

(3)f1(24)=25个1= 1 1111 1111 1111 1111 1111 1111 =2^{25}-1=33 554 432-1=33554431(此处佩服命题老师这样的数字都能想到,变态!)

        f2(24)=25个1,但是现在浮点型只能表示24位有效数字,怎么办?这里采取了0舍1如的思想,加1之后还需要右规所以阶码加1=151.最后实际表示的数是1.0*2^{25}=33 554 432.0

此处的图解

(4)f(31)=32个1=2^{32}-1

    f1(31)=32个1= 1111 1111 1111 1111 1111 1111 1111 1111=-1(这是要记住的,都是1代表-1)

所以为了使两个值相等,就要是最高位代表符号位的这一位的ji结果为0,也就是说最多有31个1,所有最大的n是30

(5)机器数 7F80 0000 的阶码为为全1 代表 正无穷

为了使f2(n)的结果不溢出,,也就是在有舍入进位的情况下为254,减去127,结果为127,对比上题25个1,n为24,所以这里最大的n为126

为了使f2(n)的结果精确,也就是最多24个1,则最大的n是23.

总结:数据的世界真精彩!

猜你喜欢

转载自blog.csdn.net/weixin_42682806/article/details/84726832
今日推荐