【问题标题】:How to do this hexadecimal subtraction problem?如何做这个十六进制减法问题?
【发布时间】:2019-01-13 15:25:03
【问题描述】:

我正在练习十六进制减法,我似乎陷入了这个问题:

0B - 74

有人能解释一下如何执行这个计算吗?十六进制答案是 -69 但我似乎不明白为什么。我应该尝试转换为二进制还是以 10 为底的数字来帮助我解决这个问题?

【问题讨论】:

    标签: binary hex base subtraction


    【解决方案1】:

    0x0B - 0x74 = 0x0B + (-0x74),我们从小学就知道。

    二进制补码告诉我们

    -0x74 = (~0x74) + 1.

    所以cpu是这样解决的:

              1
       00001011
    +  10001011
    ============
    

    完成填写,就像小学一样,但更容易,因为它是 base 2。

      000010111
       00001011
    +  10001011
    ============
       10010111
    

    msbit 匹配的进位和进位,所以答案合适。 0x97 这是 -(0x68+1) = -0x69。

    还要注意如果这是 0x00B - 0x074 它仍然有效

                  1
       000000001011
    +  111110001011
    ===============
    

    结果是 0xF97,即 -0x069。互补之美。

    (以二进制补码取反一个数字的一​​种方法是反转(一个补码)并加一)

    您根本不必转换基数,您可以像基数 10 或 2 一样轻松地计算基数 16。如果我们想从小学减去数字,我们必须从较小的数中取最大数

      74
    - 0B
    ======
    

    b 大于 4 所以我们必须借用

       1
      64
    - 0B
    ======
       9
    

    0x14 - b = 0x9。

       1
      64
    - 0B
    ======
      69
    

    0x6 - 0x0 = 0x6。

    因为我们不得不翻转数字,因为 0x74 大于 0x0b,所以我们否定结果 -0x69。

    没有魔法。初等数学。

    【讨论】:

    • 如果没有计算器/机器只是在纸上,转换为二进制/基数 2 并返回十六进制比转换为基数 10 并返回(如果二进制更容易)更容易。如果您有一个计算器(可以进行十六进制/十进制转换),那么您可以使用它并获得 0xFFFF....97,它否定 0x69。或转换为十进制,然后用十进制计算(在计算器上)。
    【解决方案2】:

    0x0B - 0x74 = 11 - 116 = -105 (-0x69)

    在十进制 11-116 中,第二个值更大,所以我在脑海中改为 -(116-11) 翻转值 = -(105) = -105。

    在 hexa 中你可以做同样的事情 -(0x74 - 0x0B),现在对于第一个(最低有效)数字 0x4 - 0xB 又太多了,所以借一个 => 0x14-0x0B (20-11) = 9(一个找到数字)。现在第二个数字:0x7 - 0x0 - 借 = 0x7 - 0x1 = 0x6 => 全值 0x69 并且符号翻转正在等待这个结果 = -0x69

    验证结果:

    -0x69 + 0x74 = 0x0B (注意 -0x9 + 0x4 实际上是 0xB (11),因为你从 4 到 9 “向下”,即 3、2、1、0(-4 完成),接下来是 F (!), E, D, C, B(另外一个 -5 = -9)。如果你习惯了十进制,那么一直记住“16 进制”可能有点困难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多