我正在上计算机系统类(class),部分时间在Two's Complement苦苦挣扎。我想了解它,但是我读过的所有内容都没有为我带来帮助。我已经阅读了wikipedia article和其他各种文章,包括my text book

因此,我想开始这篇社区Wiki 帖子,以定义Two's Complement是什么,如何使用它以及它如何在诸如强制类型转换(从有符号到无符号,反之亦然),按位操作和按位操作期间影响数字。轮类操作。

我希望得到的是一个清晰简洁的定义,程序员可以轻松理解。

最佳答案

Two's complement是一种存储整数的聪明方法,因此常见的数学问题非常容易实现。
要理解,您必须考虑二进制数。
它基本上说,

  • 为零,全为0。
  • 为正整数,开始递增计数,最大值为2(位数-1)-1。
  • 用于负整数,做完全相同的事情,但是切换0和1的作用(因此,不是以0000开头,而是以1111开头-这是“补数”部分)。

  • 让我们尝试使用4位的小字节(我们将其称为nibble-1/2字节)。
  • 0000-零
  • 0001-一个
  • 0010-两个
  • 0011-三个
  • 01000111-四到七个

  • 那是我们可以肯定的。 23-1 = 7。
    对于底片:
  • 1111-负一
  • 1110-负两个
  • 1101-负三
  • 11001000-负4到负8

  • 请注意,您获得了一个额外的负值(1000 = -8),而不是一个正值。这是因为0000用于零。这可以视为计算机的Number Line
    区分正数和负数
    这样做,第一位具有“符号”位的作用,因为它可用于区分非负十进制值和负十进制值。如果最高有效位是1,那么二进制可以说是负数,就好像最高有效位(最左边)是0一样,您可以说十进制值是非负数。
    "Sign-magnitude"负数的正负号只是正负号的翻转,但是这种方法必须将1000(一个1,然后是所有0)解释为“负零”,这令人困惑。
    "Ones' complement"负数只是它们的正数对应物的位补码,这也导致1111(全为1)引起混淆“负零”。
    除非您与硬件非常接近,否则您可能不必处理Ones的补数或Sign-Magnitude整数表示形式。

    关于binary - 什么是 “2'的补语?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1049722/

    10-11 18:42