负十进制转二进制

Max*_*xim 10 conversion

我一直在尝试将数字 -441 转换为二进制数,但我真的不知道如何才能做到这一点。

我首先将 441 转换为二进制,即:110111001 然后我应该接受这个数字的恭维,即:001000110 然后我必须添加一个结果:001000111

练习说我必须用 10 位和 16 位给出二进制表示,所以我虽然我可以在数字前放一个零,就是这样,但是经过大量搜索我发现我应该把数字前加一,为什么会这样?

我将如何将 -441 转换为 16 位数字?

谢谢你。

gro*_*taj 18

你很困惑,因为你忘记了一定有什么东西可以区分正数和负数。

假设您想在 8 位上存储非负数。

  • 00000000 是 0,
  • 00000001 是 1,
  • 00000010 是 2,
  • 00000011 是 3,
  • 00000100 是 4,
  • ...
  • 11111111 是 255

因此,您可以在 8 位上存储 0-255 范围内的数字。255 = 2 8 - 1.(2是二进制的基数,8是位数,减1是因为我们要算0)

现在,假设您也想存储负数。我们怎样才能做到这一点?我们可以将一位专用于符号。如果这个位是0那么我们将其他 7 位解释为正数,否则为负数。最好使用最高有效位作为符号,因为它使某些操作更容易。

  • 简单的方法:只需按原样读取数字:

    • 00000001== 1 和10000001== -1
    • 01000010== 66 和11000010== -66
    • 01111111== 127 和11111111== -127
  • 一个的补码:对于任何数x,否定其二进制表示产生 的二进制表示-x。这意味着:

    • 00000001== 1 和11111110== -1
    • 01000010== 66 和10111101== -66
    • 01111111== 127 和10000000== -127
  • 二进制补码:对于任何数x,将其二进制表示取反并加 1 产生 的二进制表示-x。这意味着:

    • 00000001== 1 和11111111== -1
    • 01000010== 66 和10111110== -66
    • 01111111== 127 和1000001== -127
    • 10000000 == -128

为什么补码是最好的?

  • 因为它的范围最广:-128...127,而平凡的方法和补码有-127...127
  • 零是明确定义的:
    • 在二进制补码中只有00000000
    • 在平凡的方法中,0000000010000000都为零
    • 在一个的补码中0000000011111111都为零
  • 加减法与无符号数相同,因此 CPU 不需要额外的指令来添加有符号数。

请注意,如果我们将最高有效位专用于符号位,那么我们无法在不知道需要多少位的情况下将数字转换为二进制。例如,我们有 4 位,那么简单方法中的数字 -5 是1101,在 7 位上它将是10001010001101(4 位 -5 用零填充到 7 位长度)实际上是 13(最高有效位是 0,所以它是正的)。

我不会为你做功课,但我可以给你一般的提示:

转换-xN位长二进制补码表示:

  1. -x使用二进制补码转换为二进制。
  2. 用零左填充它直到N-1长度。
  3. 在左侧添加负号位。

我想你可以从这个答案中找出其余的。如果您还有其他问题,请发表评论。