zoukankan      html  css  js  c++  java
  • 数据的表示方法和运算方法

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

    (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:表示真值的正负号为负-。

  • 相关阅读:
    八、基本数据结构(图形结构)
    七、基本数据结构(树形结构)
    4、使用 ImportTsv 将 Hive 数据导入 Hbase
    六、跳表
    五、二分法查找
    四、归并排序 && 快速排序
    一、kafka 介绍 && kafka-client
    三、排序之冒泡、插入、选择
    二、YARN
    三、synchronized & lock
  • 原文地址:https://www.cnblogs.com/flowerslip/p/5898116.html
Copyright © 2011-2022 走看看