【问题标题】:Is the two's complement of a negative integer used only for addition and subtraction?负整数的二进制补码是否仅用于加法和减法?
【发布时间】:2020-03-21 22:14:25
【问题描述】:

例如,

二进制的13是:00000000 00000000 00000000 00001101。 -13 将存储为 10000000 00000000 00000000 00001101 (使用最高有效位表示符号)还是使用二进制补码存储? (特别是在 C 中)

如果使用最高有效位来表示符号存储,那么实际上何时使用二进制补码?

【问题讨论】:

  • C doesn't mandate a particular representation for negative integers。 “是二进制补码......仅用于加减法”的前提没有意义。在对负整数使用二进制补码的系统上,它将用于所有负整数,无论​​对它们执行什么操作。
  • 啊我明白了,我以为二进制补码只在加减时使用,但实际上它用于存储所有负整数。谢谢
  • @TaseenA 改变表示只做一些操作是一个奇怪的想法。注意 10000000 00000000 00000000 00001101 不是 13 的两个补码,它是 111111...1110011

标签: c twos-complement signed-integer


【解决方案1】:

C 可以根据实现以任何格式存储负数。最流行的(现在其他系统几乎没有使用)是两个恭维格式。

但你的数字不是 2compliment 的。

-13 二进制是 0b11111111111111111111111111110011

查看负数的无符号表示:https://godbolt.org/z/ajDDvc

【讨论】:

    【解决方案2】:

    Two's Complement 是一种流行的表示数字的形式,其中二进制范围的一半是负数。它可以用于所有算术运算,而不仅仅是加法和减法。简而言之,以这种方式存储数字“有意义”。反对它的一个原因可能是您希望避免使用太多位的压缩算法(例如 zig-zag 格式等)。

    例如,将两个 8 位数字“5”和“-3”相乘,它们以二进制表示为 10111111101,计算机可能会将其分解为检查每个位的问题在一个因素中,并将每个位组移位的另一个因素相加:

      5<<0
    + 5<<2 (skipping 5<<1, because that bit is not set)
    + 5<<3
    + 5<<4
    + 5<<5
    + 5<<6
    + 5<<7
    ------
      1265 
    

    1265 在 8 位空间中换行到 241,这是二进制 11110001,它是 -15 的二进制补码。在一些较旧的计算机上,乘法需要更长的时间来设置数字的位数,这可能是由于需要额外的算术。

    除法有点棘手,是最昂贵的算术运算,但这里的本质是二进制的恭维是一种存储数字的方法,计算机易于使用,因为不需要额外的逻辑来测试执行大多数操作之前的符号位。

    也就是说,“不”,它不仅仅用于加减法。

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 2019-02-20
      • 2018-05-26
      • 2017-02-13
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      相关资源
      最近更新 更多