verilog之原码、反码、补码、绝对值的乘法运算理解与证明

全文以以下4bit有符号数为例:

(先说结果,后证明)

条件:

A = 1000b(补码) = -8d

B = 1110b(补码) = -2d

结果:

A * B = -2 * -8 = 16d =0001 0000b(补码=原码)

理解:

  • 首先,被乘数和乘数都是4bit,所以结果是8bit
  • 用原码表示有符号数很简单,负数就是把正数的最高为改为1;
    正数:原码 = 反码 = 补码;
    负数的反码:原码(除符号位)取反;(中间过程,一般用不到)
    负数的补码:反码+1;计算机运算用的是补码
    数值 原码 反码 补码
    1 0001 0001 0001
    0

    0000

    1000

    0000

    1111

    0000
    -2 1010 1101 1110
    -7 1111 1000 1001
    -8 无原码 无反码 1000

     

 

 

 

 



 

  • 补码的运算,一般要用到绝对值,正数的绝对值为本身,以下证明负数的绝对值

    |补码| = 反码 + 1    (负数补码的绝对值 = 补码的反码 + 1),以4bit为例:

    ∵ 补码 + |补码| = 0;
    ∵ 补码 + 反码 = 1111 = 0 - 1
    ∴ 反码 + 1 = 0 - 补码 = |补码|  得证

    所以乘法运算可以通过取绝对值相乘的结果,再判断符号位来完成;
  • 这里-8的补码为1000,绝对值也是1000。

证明结果:

|A| = 1000
|B| = 0010
|A| * |B| = 0001 0000b = 16d

 

 

 

 

你可能感兴趣的:(FPGA,FPGA)