zoukankan      html  css  js  c++  java
  • 定点数的表示和运算

    定点数的表示

    重点,难点

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

    1001 1100B

    寄存器的长度直接反映出了无符号数的表示范围。

    表示范围:

    8位二进制数:2的8次方种不同状态

    0000 0000 ~ 1111 1111 = 1 0000 0000 - 1

    0~255=2^8 - 1

    [n位无符号数表示范围为:0 - 2^n-1 ]

    有符号数:

    +156D = 0 1001 1100B

    -156D = 1 1001 1100B

    真值 机器数

    小数点怎么办?

    没有专门硬件表示小数点。按约定来表示的

    小数点:隐含存储(定点数:事先约定;浮点数:按规则浮动)

    [有n位尾数的定点小数:-(1-2^{-n})... 1-2^{-n} ]

    [有n位尾数的定点整数:-(2^n-1)...(2^n-1) ]

    原码

    有符号数:

    1. 原码表示法
    2. 补码表示法
    3. 反码表示法
    4. 移码表示法

    原码:

    [[x]_原=left{ egin{array}{rcl} 0,x & & {2^n > x ≥ 0}\ 2^n-x=2^n+|x| & & {0≥x>-2^n} end{array} ight. ]

    符号+真值

    如果是负数的话,前面多一个1,所以有2的n次方

    2的n次方减去真值(因为是负值)部分。

    实际上就是绝对值 + 1或者0

    [若字长为n+1,则原码整数的表示范围为-(2^n-1)≤x≤2^n-1(关于原点对称) ]

    纯小数

    原码的特点:简单、直观

    补码

    原码在加减的情况会出现问题

    如何把减法统一成加法?

    时钟,模12

    补数:

    一个负数加上“模”即得到该负数的补数

    补码:

    对于正数,补码与原码的表示相同

    对于负数,原码符号位不变,数值部分按位取反,末位加1(取反加一

    [若字长为n+1,则补码的表示范围为-2^n≤x≤2^n-1(比原码多表示-2^n) ]

    小数还是纯小数

    反码

    对于正数,反码与原码的表示相同

    对于负数,原码符号位不变,数值部分按位取反

    表示范围:原码一样

    原补反相互转换

    最高位为符号位,书写上用“,”(整数)或“.”(小数)将数值部分和符号位隔开。

    对于正数,原码=补码=反码

    对于负数,符号位为1,其数值部分

    原码除符号位外每位取反末位加1->补码

    原码除符号位外每位取反->反码

    移码

    用来干啥的?

    补码是很难表示真值的大小的。

    移码就是在真值X上加上一个常数(偏置值),通常这个常数去2的n次方。

    只有整数才有移码

    定点数的运算

    1. 移位运算
    2. 加减
    3. 溢出判断
    4. 乘除
    5. 强制类型转换

    移位运算

    左移:绝对值扩大

    右移:绝对值缩小

    [右移n位:/r^n,左移n位:*r^n ]

    和加减法结合实现了乘除法

    算术移位:机器码采用有符号数

    符号位不参与移位

    正数:原码、补码、反码都一样->左移右移都补0

    负数:反码1,原码0,补码左移0右移1

    原码算术移位:左移丢1,运算出错;右移丢1,影响精度。

    逻辑移位

    机器数采用无符号数:逻辑移位

    逻辑左移时,高位移丢,低位添0

    逻辑右移时,低位移丢,高位添0

    循环移位(了解即可)

    最高位添到最低位。

    加减运算

    补码:两个有符号数可以直接相加,不需要分类讨论

    加减法的基本思路:

    1. 转化为x+y的形式
    2. 计算两个补码的相加

    做题。

    符号扩展

    -B的补码:连通符号位一起取反

    -c的补码:连同符号位一起取反。

    溢出判断

    如何判断溢出?

    一:

    两个整数相加,符号位变成1

    两个负数相加,符号位变成0

    逻辑表达式

    与:如ABC,表示A与B与C,仅当A、B、C均为1时,ABC为1,A、B、C中有一个或多个为0,则ABC为0

    或:如A+B+C,表示A或B或C,仅当A、B、C均为0时,A+B+C为0,ABC中有一个或多个是1,则A+B+C为1

    非:如Abar,表示A非,取反。

    二:

    采用一位符号位。根据数据位进位情况判断溢出

    三:

    采用双符号位

    正数符号为00,负数符号为11

    乘法运算(了解过程)

    直接做题。

    原码一位乘法

    计算机用两个寄存器(累加器(保存机器字长),乘商寄存器(保存乘数的绝对值))

    初始累加器里的值000000.

    乘商寄存器最右边那个数字是1,则竖式+x

    如果是0,就+00000,竖式不变

    做一次操作写进累加器里,然后竖式里、ACC、MQ右移一位。

    一直从MQ里移出来的值变成乘数后,结束。

    ACC和MQ里全部就是结果

    补码一位乘法

    Booth算法。原理不需要掌握。

    第一步,先求出补码。用两位符号位

    乘法运算回顾:

    除法运算(了解过程)

    符号位和数值位分开处理

    笔算:

    原码恢复余数法

    符号位数值位分开处理

    首先把绝对值写出来,在写出y绝对值补码,y的绝对值相反数的补码

    加上y的y的绝对值相反数的补码,判断是不是大于y的

    不是商0,是商1,左移

    原码不恢复余数法

    若余数为负数,

    需要加回。

    补码加减交替法

    先求出补码和负数的补码(原码是要求绝对值的补码)

    被除数和除数同号,则被除数减去除数;异号则被除数加上除数。

    余数和除数同号,商1,余数左移一位减去除数;

    余数和除数异号,商0,余数左移一位加上除数。

    重复n次。

    末尾恒置1

    除法运算总结回顾

    用十进制算不香嘛?

    强制类型转换

    无符号数与有符号数:不改变数据内容,改变解释方式

    short x = -4321;	//short占用2个字节
    unsigned short y = (unsigned short)x;
    

    x: 1110 1111 0001 1111

    y:1110 11110001 1111——真值:61215

    长整数变短整数:高位截断,保留地位。

    int a = 165537,b=-34991;	//int占用4个字节
    short c = (short)a, d = (short)b;
    

    a:0x000286a1

    c:0x86a1——真值-31071

    b:0xffff7751

    d:0x7751——真值30545

    短整数变长整数:符号拓展

    short x = -4321;
    int m = x;
    unsigned short n = (unsigned short)x;
    unsigned int p = n;
    

    x:1110 1111 0001 1111

    m:1111 1111 1111 1111 1110 1111 0001 1111——真值-4321

    n:1110 1111 0001 1111——真值61215

    p:0000 0000 0000 0000 1110 1111 0001 1111——真值61215

    回顾

  • 相关阅读:
    java 数据结构容器之HashSet
    java LinkedList模拟堆栈
    Java实现windows7标准型计算器
    Java迭代器注意事项
    (动态规划求解)聪明的kk
    三张图讲清楚Java中的方法的参数传递机制
    Java对象在内存中的表示
    两张内存变化图揭秘二维数组的初始化
    四张內存变化图揭秘引用类型数组的初始化
    三张內存变化图揭秘基本类型数组的初始化
  • 原文地址:https://www.cnblogs.com/jev-0987/p/13432361.html
Copyright © 2011-2022 走看看