【问题标题】:Is 2's complement representation also used on positive numbers?2 的补码表示是否也用于正数?
【发布时间】:2016-10-31 12:15:28
【问题描述】:

当我写的时候:

signed int a = 4;

我的电脑是用 2 的表示吗?

因为如果我的计算机使用 2 的补码表示数字 4,这就是在 8 位机器上会发生的情况:

二进制值 4 : 0000 0100

2 的补码变为:1111 1011

加1:1111 1100

但我读到,当最重要的位是 1 时,您的数字是负数。但这里我最重要的位是 1 ,我的数字是 4 。它不是-4。

为什么我的数字 4 的最高位是 1?

【问题讨论】:

  • 2 的补码用于减法;你不使用它来执行加法。
  • 您可能想read more about two's complement。此外,您所说的 2 的补码 (1111 1011) 实际上不是二进制补码,而是 one's complement
  • @Someprogrammerdude - 只是 OP 的措辞不佳,然后他添加了 1
  • 二回答你的问题,二的补码是表示负数。正数按原样表示。
  • 你的号码 4,但是通过在4 上执行 2 的补码,你在这个符号中变成了 -4,它不会保持相同的数字。

标签: c integer unsigned-integer


【解决方案1】:

2 的补码变为:1111 1011

没有。你是从哪里得到这个想法的? 1111 1011 是二进制补码中的-5-5 不是 +4

-4 也不等同于+4

4 的二进制值是 0000 0100。4 的有符号数变量表示因此也是 0000 0100。

除非数字是负数,否则二进制补码是无关紧要的。

为什么我的数字 4 的最高位是 1?

它没有。您的 -4 的 msb 为 1。

【讨论】:

    【解决方案2】:

    当你将 a 初始化为:

    signed int a;
    

    机器将保留最后一位(MSB)作为正值或负值的标记。

    0 表示阳性

    1 表示否定

    当您取一个数字的 2 补码时,该数字取 1 的补码并在其上加 1(关于问题措辞的混淆) 你否定了你正在使用的号码。

    所以当你对 4 进行 2 的补码时,你会得到 1111 1100,这是 -4 的二进制表示法 由于这是负数,因此 MSB 为 1

    【讨论】:

      【解决方案3】:

      在某种意义上,有符号整数是“2 的补码”,因为它需要为符号保留最左边的位。 “2的补码”告诉如何使用“翻转位+一”使正整数为负数。 含义是正整数以 2 为底,只能使用 n-1 位,其中 n 是 int 中的位数。

      所以“2 的补码”是一种用二进制表示负数,而不是用二进制表示正数的方法。

      【讨论】:

        猜你喜欢
        • 2012-04-06
        • 2012-04-14
        • 2012-02-28
        • 1970-01-01
        • 2012-06-18
        • 2018-06-06
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        相关资源
        最近更新 更多