实际上该篇文章的定位还是蛮高的,就像计算机网路中的特殊地址一样,是不是几乎每年必考?在计算机组成这门课里,数据的范围通常会以小题的形式考察,但不排除例外,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-) 最大正数0.111 1111=1- 范围 -(1-) ~(1-)
反码:最小负数 1000 0000=-127 最大正数 0111 1111 =+127 范围-127~+127
最小负数1. 000 0000=-(1-) 最大正数0.111 1111=1- 范围 -(1-) ~(1-)
原码和反码还需要注意的一点就是对于0 都有两种表示,而补码对于0的表示是唯一的,所以可以多表示一个负数。
补码 : 最小负数:1000 0000=-128 最大正数:0111 1111=+127 范围-128~+127
最小负数 1,000 0000 =-1 最大正数0.111 1111=1- 范围 -1 ~(1-)
这里需要关注几个特殊的取值。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
浮点数:最大值: 用阶码为255表示 最小值
+0: 0000 0000 H -0 8000 0000H
正常情况下 最大的 数
最小的数
下面讨论一下数据的位数,这就是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*
所以阶码的值应该为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 ==33 554 432-1=33554431(此处佩服命题老师这样的数字都能想到,变态!)
f2(24)=25个1,但是现在浮点型只能表示24位有效数字,怎么办?这里采取了0舍1如的思想,加1之后还需要右规所以阶码加1=151.最后实际表示的数是1.0*=33 554 432.0
此处的图解
(4)f(31)=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.
总结:数据的世界真精彩!