【问题标题】:Two's complement of a number一个数的二进制补码
【发布时间】:2021-02-16 06:50:56
【问题描述】:

据我所知,如果我想以二进制形式表示-1,那么:

  1. 我将首先查找 1 的二进制表示,即 0001。

  2. 然后我会找到一个补码(将所有 0 和 1 取反)得到 1110。

  3. 然后将最低有效位加 1,得到 1111。这是我的答案。

但是我有疑问,如果我将 1(在第 1 步中)表示为 001(我相信我们可以做到这一点),那么一个补码将是 110,加 1 会得到 111,这与我得到的不同以前。

您如何解释这种差异?

【问题讨论】:

  • 想想你有N 可用位,它提供了从 0 到 2^N - 1 的总范围。但是你想允许负数,所以你将值空间分成两半 - - 一半用于正面,一半用于负面。为了实现这一点,你牺牲了一点。在一个补码中这很容易,但是有一个问题,因为零变成了两种表示形式(+0 都是 0 位,-0 都是 1 位)。二进制补码通过加 1 来解决这个问题,这允许存在一个额外的负数。
  • 你的推理很好,唯一的区别是你用来表示整数的位数。

标签: c binary numbers binary-data


【解决方案1】:

-1 的补码表示是“全 1”。

无论你的数字表示中有多少地方,都将它们全部设置为 1,这就是 1 的二进制补码。

有关详细信息,请参阅“符号扩展”。

【讨论】:

  • 那么,您的意思是说(-1)的表示在 16 位和 32 位系统上会有所不同,因为位数不同。
  • 是的,这取决于大小。例如,负数 int 是 32 个 1,而对于 char,它只有 8 个 1。
  • 表示并没有真正的不同,除非你说 +1 的表示也不同。 001 和 00001 有区别吗?就像你想象正数前面有无数个零一样,负数前面有无数个零(但只有一定数量的数字适合你的类型)。
猜你喜欢
  • 1970-01-01
  • 2016-05-18
  • 2021-12-22
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多