【问题标题】:Does computer always follow 2's complement method to represent negative number? [duplicate]计算机是否总是遵循 2 的补码方法来表示负数? [复制]
【发布时间】:2018-06-06 11:42:12
【问题描述】:

请查看以下代码,帮助我理解

int a=1;
int b=~1;
printf("%d",b);

输出是:

 -2

所以这表示 1=(00000001) 当经历 ~ 产生 (11111110) 这是数字 2 的 2 的补码,因此 -2 是答案。 所以 100 总是被假定为 -4 而不是 4 ?

【问题讨论】:

  • 负数将始终设置最高位。因此,如果您的字节长度超过 3 位,则 100 将始终为 8,而不是 -4。
  • 从技术上讲,并非每台计算机都使用二进制补码,但如今很少找到不使用二进制补码的计算机。
  • 听起来你在要求一个基本二进制编码的教程。
  • 不完全。 MSB 既是标志又是数据的一部分。此外,虽然它通常是 8 位,但一个字节可以是任意数量的二进制数字。
  • @动漫。我从未听说过不允许签名和未签名操作的通用机器。寄存器被解释为操作需要的任何内容。如果调用无符号加法,则 3 位寄存器中的 100 为 4。如果使用有符号加法,则为 -4。 必须决定你想要哪个。 100 只是内存中位的集合,处理器会按照您的要求执行任何操作。

标签: c++ c


【解决方案1】:

只有在已经确定了数字的确切位数时,才能定义二进制补码。您在存储位 100 的地方是否有一个三位有符号整数类型?如果是这样,那么 100 将被解释为 -4。

如果您将其存储为更大的整数类型,我们通常会假设 1 左侧的其他位全为 0(否则您应该显示它们是什么)并且值为正 4。

顺便说一句,现在很难找到一个编译器,它的 C 或 C++ int 类型只有 8 位,就像问题中的那个一样。 (好吧,“不寻常”是一种轻描淡写的说法——正如评论所指出的那样,标准不允许这样做,据我所知,从未认为拥有一个普通的int 是合法的如问题中所示的类型可以存储在少于 16 位中。 您可以struct 中声明一个只有 3 位的有符号整数位字段,但其语法与问题显示的完全不同。) 因此,即使将int b=~1; 解释为存储位模式11111110,也不是很正确;实际的位模式至少有 16 位,而近年来我们大多数人只看到它编译为 32 位。

【讨论】:

  • 所以假设我有一个 3 位寄存器并且我在那里存储了 100,所以我的计算机会将它理解为 -4 对吗?
  • 是的,如果你能找到这样的东西。您可以尝试将位字段 (docs.microsoft.com/en-us/cpp/c-language/c-bit-fields) 声明为带符号的 int ——不过,我自己从未尝试过。
  • @动漫。你的电脑什么都不懂。它有一些你可以触发的操作。其中一些将被签名,并将 100 视为 -4。其他人将未签名并将 100 视为 +4。您的工作是展示必要的理解并应用正确的操作。当您使用 C++ 编译器时,您可以通过声明正确的类型并在需要时进行强制转换来做到这一点。
  • @DavidK 我在这里有一个类似的问题,假设如果我执行 '2
  • C 标准要求至少 16 位(从技术上讲,它要求足够大以容纳 ±32767)。
【解决方案2】:

计算机总是用 2 的补码法来表示吗 负数?

没有。

有些计算机使用 1 的补码(其中 ~1 == -0),有些使用“符号和幅度”(其中 ~1 == -127),有些使用“偏差”(其中有符号值是“无符号值 -偏差”,其中〜1 == 127)。对于整数,这些现在都比较少见。

标准 (IEEE-754) 浮点格式并不罕见;这是“符号和大小”(用于有效数字)和“偏差”(用于指数)的完美结合。

【讨论】:

  • 鉴于问题标记为 C,您最好将自己限制为二进制补码、一个补码和符号/大小。标准不允许其他选项。并注意撇号的位置,这很重要:-)
  • 为了澄清“相对罕见”,曾经使用除二进制补码以外的任何东西的符合 C99 或 C11 实现的实际使用总数是否超过零?
猜你喜欢
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
相关资源
最近更新 更多