数据的表示方法和运算方法

计算机中常用的数据格式为 定点数 和浮点数。

(1)定点数:小数点不再使用记号“.”表示,通常将数据表示成纯小数和纯整数。

       格式:   符号-尾数  (符号0表示正号,1表示负号)

(2)浮点数:浮点数的规格化表示方法(即 IEEE754标准的存储格式对应的表示方法)

        注意:(1)基数2 对二进记数制的机器是一个常数。无论32位浮点数还是64位浮点数,由于基数2是固定常数,所以没有用显示方式来表示它。

               *(2)十进制也有规格化。

        格式:  符号位s(0表示正号,1表示符号)-阶码E(浮点数指数真值e 加固定偏移值127或255)-尾数(有效数)M(23位字段存储24位有效数)

       32位:  x=(-1)^s * (1.M) * 2^(E-127)

       64位:  x=(-1)^s * (1.M) * 2^(E-1023)

       浮点数的指数真值e =E(754标准存储格式中的阶码)-127(或1023)

       任意二进制数N的 浮点表示法: N=2^e * M    

       ---浮点数N可以变回二进制数格式 和再变为十进制数格式,eg: 1.01101 * 2^3 = 1011.01  (移动小数点)

(3)真值和原码 

机器数/机器码:由符号位和数值位组合编码表示的数(原码 补码 反码 移码 都是机器码)

二进制数: 有正二进制数 和负二进制数,eg:  +11001 和 -11001  ,即 二进制数格式有正负号。

真值:一般书写的数的某种进制表示,eg:二进制数格式(或十进制数格式)。

原码:有符号数。符号位加上 真值的二进制数格式(可能需要数制转换)的绝对值(即 去掉二进制数的正负号 )。

有符号数:原码和补码都是有符号数。

              有符号数也符合二进制数格式,但是 不属于真值格式。            

原码 就是真值的定点整数格式。

eg:     

将原码表示为真值(二进制或十进制):  eg:   原码是 1 0101 ,真值则是  -0101  或者 - (1* 2^1+1* 2^0)= -3

                                                            原码是 1 111 ,真值则是 -111 或者 - (1* 2^3+ 1*2^2+ 1* 2^1+1* 2^0)或 -(2^3 -1)= -7

将真值(二进制或十进制)表示为原码:真值 -1101,原码 1 1101;真值 +1101 ,原码 0 1101  。

(4)真值和补码(有符号数)的运算:已知补码,求真值的十进制数:求原码,再求十进制真值。      

补码 就是真值的 补 的定点整数格式。

eg:

将补码表示为真值(十进制):eg:    

补码是 1 01011 ,求真值。

方法一(推荐) :根据补码 对负数的"补"的含义:所以真值是 (-1) *2^5 +2^3+2^1+2^0 = -21   

方法二:先求原码 是1 10101,则真值二进制是 - 10101,真值十进制是-(2^4+2^2+2^0)= -21  。

(5)源码和补码:

        根据原码 求补码的方法:

            当原码符号位为0时,原码即补码。

            当原码符号位为1时(真值是负数),有两种方法:  

                      I (只适用于有原码的数,所以适用于0,不适用于-128):求补操作。不管符号位,取绝对值的二进制码,按位取反,末位加1。符号位若有进位,则舍弃符号位进位。

                       II(只适用于有原码的数,所以适用于0,不适用于-128):符号位不变,从最低位开始,遇到的第一个1之前 各位0不变,第一个1不变,之后各位按位取反(符号位不取反)。

                       III.-128的补码不是算出来的,是规定的。因为-128没有8位的原码反码。我们只能理解为什么那样规定。为什么说-128没有8位的原码却有8位的补码?8位原码不是对应8位补码吗?不是。8位原码和补码不是一一对应的关系,256个原码中有-0和+0,-0和+0对应一个补码,所以256个补码中产生了一个没有8位原码的补码1000 0000,就分给了不属于8位原码行列的-128,所以这只是规定而已。继续往下想一下,-128的原码可以用16位表示出,那么16位的补码中可能多出一个位子,-0和+0的16位补码一样,又多出一个补码的位子,所以国际标准是不是把多出这些补码留给32位,就不知道了。所以,这些临界数的补码就是规定而已,需要特殊看待,不能用求补操作这样需要有原码的方法。

                       eg:  [x]原=1 10010   

                              [x]补=1 01110

               注意几个比较特别的数:80H,原码1000 0000,即真值是-0,求补操作,所以补码是0000 0000。具体讨论看另外一篇随笔。

                                              00H,原码0000 0000,即真值+0,符号位为正,所以补码是0000 0000。

                                              真值-128,没有8位的原码反码,只有8位的补码,-128补码是1000 0000。

                                              真值+128,8位表示不下。

                                              真值-1,原码1000 0001,求补操作,所以补码是1111 1111。         

                                              

  (6)求补操作:

不考虑有没有符号位,符号位是正还是负,统一操作。不考虑补码意义,只是在减法的时候机器的操作(对减数求补操作),不是求补码的方法。

求补操作:各位取反再加一,无论是有符号数还是无符号数,符号数还是尾数。

因为在机器中的数,机器不知道事先不知道它是有符号数还是无符号数,所以自然也不知道它是正数还是负数了。

机器无法识别是有符号数还是无符号数,需要程序员帮它识别。

(7)几个计算技巧

十进制数的小数部分 转换成二进制数:

eg:  20.5935=10100.10011 (整数部分取值:由下往上   小数部分取值:由上往下)

        0.5935

x              2

___________

       1.18750----1

x               2

____________

        0.37500----0

x                 2

____________

        0.75000----0

x                 2

____________

         1.50000----1

x                 2

____________

          1.00000----1

(6)移码

通常用于表示浮点数的阶码。

移码的符号位表示规律 和原/补/反码相反: 移码的符号位为1:表示真值的正负号为+ ;移码的符号位0:表示真值的正负号为负-。

原文地址:https://www.cnblogs.com/flowerslip/p/5898116.html