zoukankan      html  css  js  c++  java
  • 205.码制

    1.定义

          计算机中的数是用二进制来表示。数的符号也是用二进制表示的。在机器中,把一个数连同其符号在内数值化表示的数成为机器数。机器数可以用不同的码制来表示,常用的有原码、补码、反码表示法。一般用最高有效位表示数的符号,正数用0表示,负数用1表示。

         原码由真值得来,真值(人理解的数 +3 -3 +1.5 -1.5)是一个变量本身所具有的真实值,是一个理想概念,一般无法得到。

    2.原码

     2.1真值化原码

    整数 +5D -5D
    1 取绝对值 [+5]真值→|+5|=5 [-5]真值→|-5|=5
    2 化二进制 (5)10=(0101)2=0101B (5)10=(0101)2=0101B
    3 加正负号(此时位机器真值) 0101B加符号 → +0101B机器真值 0101B加符号 → -0101B机器真值

    4 标准化

    (符号位正为0负为1,尾数外中间补0)

    +0101B=0 000 0101B -0101B=1 000 0101B
    [+5]原码=0 000 0101B [-5]原码=1 000 0101B
    纯小数 +0.8125D -0.8125D
    1 取绝对值 |+0.8125|=0.8125 |-0.8125|=0.8125
    2 化二进制 (0.8125)10=(0.1101)2=0.1101B (0.8125)10=(0.1101)2=0.1101B
    3 加正负号 0.1101B加符号 → +0.1101 0.1101B加符号 → -0.1101B机器真值

    4 标准化

    (符号位正为0负为1,右补足8位)

    +0.1101B=0.1101 000B -0.1101B=1.1101 000B
    [+0.8125]原码=0.1101 000B [-0.8125]原码=1.1101 000B

     纯小数表示范围为(-1,1),所以8位0.1101 000B存储为0110 1000,并不会和0110 1000表示的整数冲突

    3.反码

     正数 原码、反码、补码 一样

     负数 反码在原码基础上,符号位不变,其他位按位取反

    [+5]=[+5]=[+5]=0 000 0101B
    [-5]=   1 000 0101 B

    [-5]=[-5]+1=111 1011B

                        末位加一

    符号位不变↓其余按位取反
    [-5]=   1 111 1010 B
     [+0.8125]=[+0.8125]=[+0.8125]=0.1101 000 B
     [-0.8125]=1.1101 000

    [-0.8125]=[-0.8125]+0.000 0001

    =1.001 0111+0.000 0001=1.001 1000

          符号位不变↓其余按位取反
     [-0.8125]=1.0010 111

    4.补码

    4.1定义

    补码表示法中,

    正数采用 符号-绝对值 表示,即数的最高有效位为0表示正,数的其余部分则表示数的绝对值

    机器字长8位:

    [+1] = 0 000 0001

    [+127] = 0 111 111

    [+0] = 0000 0000

    补码表示负数,n位机器字长表示负数X为 2n-|X|

    机器字长8位:

    [-1] = 28-1 = 1 111 1111

    [-127] = 28-127 = 1 000 0001

    [-0] = 28-0 = 0000 0000

    注意

    补码表示法中0只有一种表示即 0000 0000

    对于1000 0000,在补码表示法中被定义为  -128

    8位 原码 反码 补码
    +0 0000 0000 0000 0000    0000 0000
    -0 1000 0000 1111 1111 1 0000 0000 cf=1
    范围 -127D˜127D -127D˜127D -128D˜127D

    8位可以表示28个不同的数,+0和-0补码都是0000 0000,空一个表示-128

    4.2转化

    正数

      原码、反码、补码 一样

    负数

      法一:补码在反码基础上,末位加一 

    [+5]=[+5]=[+5]=0 000 0101B
    [-5]=   1 000 0101 B

    [-5]=[-5]+1=111 1011B

                        末位加一

    符号位不变↓↓其余按位取反
    [-5]=   1 111 1010 B
     [+0.8125]=[+0.8125]=[+0.8125]=0.1101 000 B
     [-0.8125]=1.1101 000

    [-0.8125]=[-0.8125]+0.000 0001

    =1.001 0111+0.000 0001=1.001 1000

          符号位不变↓↓其余按位取反
     [-0.8125]=1.0010 111

      法二:对于一个正数的补码表示  按位求反后再在末位加一  可以得到与此正数相对于的负数的补码表示

      机器字长为8位 机器字长为16为
      -46D的补码 -117D的补码

    1  先写出与该数相对应的

    正数的补码表示(符号-绝对值法)

    +46D的补码表示为

    0010 1110

    +117D的补码表示为

    0000 0000 0111 0101

    2  将其按位取反 1101 0001 1111 1111 1000 1010
    3  在末位(最低位)加一 1101 0010 1111 1111 1000 1011
    4  用十六进制表示 D       2 F       F       8      B
    5  结果 [-46] = D2H [-117] = FF8BH

    4.3计算

    4.3.1求补运算

    定义

    对于一个二进制数→按位求反→在末位加一  的运算称为求补运算

    推理

    补码表示的数具有以下特性:

      [X]   求补得› [-X]  求补得›  [X]

      [117]=0075H [-117]=FF8BH

    对[-117]

    作求补运算

    [-117] 1111 1111 1000 1011
    按位求反后得 0000 0000 0111 0100
    末位加一后得 0000 0000 0111 0101
      [-117] 0000 0000 0111 0101

    4.3.2加减运算

    补码的加法规则:

      [X+Y] = [X] + [Y]

    补码的减法规则:

      [X-Y] = [X] + [-Y]

    其中[-Y] 只要对[Y]求补就可得到

      [Y]补  → 所以位按位取反 → 末位加一 → [-Y] 

    十进制 二进制
      +25   0001 1001
    + +32 + 0010 0000
    = 57 = 0011 1001
           
      +32   0010 0000
    + -25 + 1110 0111
    = 7 = 0000 0111
          ↓1
           
      -25   1110 0111
    + -32 + 1110 0000
    = -57 = 1100 0111
          ↓1
           
      25   0001 1001
    + -32 + 1110 0000
    = -7 = 1111 1001
    十进制 二进制
      25   0001 1001   0001 1001
    - 32 - 0010 0000 + 1110 0000
    = -7 对减数求补换成加法 = 1111 1001
               
      -25   1110 0111   1110 0111
    - -32 - 1110 0000 + 0010 0000
    = 7 对减数求补换成加法 = 0000 0111
              ↓1

    5.符号扩展

    符号扩展是指一个数从位数较少扩展到位数较多(如从8为扩展到16位,或从16位扩展到32位)

    补码表示数的符号扩展,对于补码表示的数,正数的符号扩展应该在前面补0,而负数扩展则应该在前面补1

    机器字长为8位 [+46]=                 0010 1110 [-46]=                 1101 0010
    扩展到16位 [+46]= 0000 0000 0010 1110 [-46]= 1111 1111 1101 0010

    6.数的表示范围

    6.1n位补码

    一般来说n位补码表示的数的表示范围是 -2n-1 ≤ N ≤ 2n-1-1

    8位二进制数可以表示28=256个数,当他们是补码表示带符号数时,他们表数范围为-128 ≤ N ≤ +127

    n=16时的表数范围是-32768 ≤ N ≤ +32767

    为了扩大表数范围,在机器里,可以用二个机器字(低位字和高位字)来表示一个机器数,这种数称为双字长数或双精度数,其中高位字的最高有效位为符号位。

    机器字长为16位为例,高位字的低15位和整个低位字的16位联合组成31位数来表示数值,因而低位字的最高有效位没有符号意义只有数值意义,双字长数的表数范围可扩大到 -231 ≤ N ≤ 231-1

    15 14              0 15                   0
    符号 高位字 低位字
      补码值

  • 相关阅读:
    Bundle Adjustment
    BFL ekf imu and odom
    RNN
    深度学习的数学(笔记)
    BP 神经网络
    PCA
    SVM
    KNN
    Kmeans
    决策树
  • 原文地址:https://www.cnblogs.com/ZanderZhao/p/11147525.html
Copyright © 2011-2022 走看看