• 二进制数的补码及运算(1)


    本人研究不深,如有错误请不吝赐教!!

    1.正数的补码表示

    正数的补码 = 原码

    负数的补码 = {原码符号位不变} + {数值位按位取反后+1}    or

         = {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反}

    以十进制整数+97和-97为例:

    +97原码 = 0110_0001b

    +97补码 = 0110_0001b

    -97原码  = 1110_0001b

    -97补码  = 1001_1111b

    2.纯小数的原码

    纯小数的原码如何得到呢?方法有很多,在这里提供一种较为便于笔算的方法。

    以0.64为例,通过查阅可知其原码为0.1010_0011_1101_0111b。

    操作方法:

    将0.64 * 2^n 得到X,其中n为预保留的小数点后位数(即认为n为小数之后的小数不重要),X为乘法结果的整数部分。

    此处将n取16,得

    X = 41943d = 1010_0011_1101_0111b

    即0.64的二进制表示在左移了16位后为1010_0011_1101_0111b,因此可以认为0.64d = 0.1010_0011_1101_0111b 与查询结果一致。

    再实验n取12,得

    X = 2621d = 1010_0011_1101b 即 0.64d = 0.1010_0011_1101b,在忽略12位小数之后的位数情况下,计算结果相同。

    3.纯小数的补码

    纯小数的补码遵循的规则是:在得到小数的源码后,小数点前1位表示符号,从最低(右)位起,找到第一个“1”照写,之后“见1写0,见0写1”。

    以-0.64为例,其原码为1.1010_0011_1101_0111b

    则补码为:1.0101_1100_0010_1001b

    当然在硬件语言如verilog中二进制表示时不可能带有小数点(事实上不知道哪里可以带小数点)。


    4.一般带小数的补码

    一般来说这种情况下先转为整数运算比较方便

    -97.64为例,经查询其原码为1110_0001.1010_0011_1101_0111b

    笔算过程:

    -97.64 * 2^16 = -6398935 = 1110_0001_1010_0011_1101_0111b,其中小数点在右数第16位,与查询结果一致。

    则其补码为1001_1110_0101_1100_0010_1001b,在此采用 负数的补码 = {原码符号位不变} + {数值位按位取反后+1}  方法

    5.补码得到原码

    方法:符号位不动,幅度值取反+1 or符号位不动,幅度值-1取反

    -97.64补码 = 1001_1110(.)0101_1100_0010_1001b

    取反      = 1110_0001(.)1010_0011_1101_0110b

    +1         = 1110_0001(.)1010_0011_1101_0111b 与查询结果一致

    6.补码的拓展

    在运算时必要时要对二进制补码进行数位拓展,此时应将符号位向前拓展。

    -5补码 = 4'b1011 = 6'b11_1011

    ps.原码的拓展是将符号位提到最前面,然后在拓展位上部0.

    -5原码 = 4‘b’1101 = 6'b10_0101,对其求补码得6'b11_1011,与上文一致。





  • 相关阅读:
    上传图片并实现本地预览
    a标签传递参数
    HTTP错误 404.17–Not Found 请求的内容似乎是脚本,因而将无法有静态文件处理程序来处理
    VM虚拟机无法拖拽、粘贴、复制
    ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
    Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值
    Oracle获取表结构信息:表名、是否视图、字段名、类型、长度、非空、主键
    SQLServer2005,2000获取表结构:字段名、类型、长度、主键、非空、注释
    c# float和double的“坑”
    VS活动解决方案平台
  • 原文地址:https://www.cnblogs.com/mingmingruyue99/p/7202021.html
Copyright © 2020-2023  润新知