【问题标题】:Shifting left in 2's complement and multiplication在 2 的补码和乘法中左移
【发布时间】:2014-03-22 20:35:40
【问题描述】:

我正在实现一个简单的(虚拟)ALU 和其他一些芯片(加法器、乘法器等)。

我使用 2 的补码表示我的数字。

对于两个 16 位数字 x 和 y 的乘法,我想我会沿着这些线使用左移(这当然是在没有实际循环的情况下执行的):

  • 设置总和[0..15]=0

  • 设置 x'=x

  • for i=0...15 //(y[0] 是 LSB,y[15] 是 MSB)

    • 如果 y[i]=1,则将 x' 加到 sum 中,然后将 x' 左移。

(这是标准方式吗?)

我的问题是左移:

如果有的话x[i]=1,在某个时候,x' 的 MSB 会变为 1,这会否定它。

这是一个问题,因为例如 2*2 使用上述方法给出“-4”。

所以,我的实际问题是:左移时是否还需要考虑符号位?

【问题讨论】:

    标签: boolean-logic alu


    【解决方案1】:

    是的,你知道。

    一种简单的方法是将符号保存在某处,转换为无符号,执行数学运算,然后在为负数时转换回来。

    【讨论】:

    • 所以左移 0110 0000 0000 0000 应该产生:0100 0000 0000 0000?而且,保存符号,移位然后用原始符号位替换到当前符号位还不够吗?
    • 这是一个溢出条件,但是是的。 -- 不,你必须用 NEG 或类似的符号转换符号。在二进制补码中,-1 表示为全一,依此类推。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多