【问题标题】:Subtracting 1 from 0 in 8 bit binary8位二进制从0减1
【发布时间】:2018-03-16 04:56:47
【问题描述】:

我有 8 位 int zero = 0b00000000; 和 8 位 int one = 0b00000001; 根据二进制算术规则,

0 - 1 = 1(从下一个有效位借用 1)。

如果我有:

int s = zero - one; 
s = -1; 
-1 = 0b1111111;

所有1s 来自哪里?没有什么可以借用的,因为zero 变量中的所有位都是0

【问题讨论】:

  • 整数算术环绕零。 0 - 1 == -1,全为 1。
  • 它称为二补二进制表示。 -1 全为 1,最大的负值是最高有效位(符号位)中的 1,其他所有位置为零。 en.wikipedia.org/wiki/Two%27s_complement
  • 1 是从0 中的第一个1 借来的...即从无穷大...
  • 你的意思是-1 = 0b100000000?
  • s 的值漏掉了一点。

标签: c math binary twos-complement integer-arithmetic


【解决方案1】:

这是一个很好的问题,与计算机如何表示整数值有关。

如果你要写出一个以十为底的负数,你只需写出常规数字,然后在它前面加上一个减号。但是,如果您在一台计算机中工作,所有内容都需要为零或一,那么您就没有任何减号。接下来的问题是你如何选择表示负值。

一种流行的方法是使用带符号的二进制补码形式。其工作方式是使用 1 和 0 编写数字,除了这些 1 和 0 的含义在解释方式上与“标准”二进制不同。具体来说,如果您有一个带符号的 8 位数字,则低七位的标准含义为 20、21、22等。 但是,最高位的含义发生了变化:不是表示 27,而是表示值 -27

让我们看看数字 0b11111111。这将被解释为

-27 + 26 + 25 + 24 + 23 + 22 + 21 + 20

= -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1

= -1

这就是为什么这个比特集合代表-1。

还有另一种解释这里发生的事情的方法。鉴于我们的整数只有 8 位可以使用,我们知道没有办法表示所有可能的整数。如果您选择任何 257 个整数值,假设只有 256 个可能的位模式,则无法唯一表示所有这些数字。

为了解决这个问题,我们也可以说我们的整数值不是整数的真实值,而是整数模 256 的值。我们将存储的所有值都在0 和 255(含)。

在这种情况下,0 - 1 是多少?它是 -1,但如果我们取模 256 并强制它为非负数,那么我们会得到 -1 = 255(模 256)。你会如何用二进制写 255?它是 0b11111111。

如果您有兴趣,这里还有很多其他很酷的东西可以学习,所以我建议您阅读有符号和无符号二进制补码。

作为一些练习:在这种格式下 -4 会是什么样子? -9 怎么样?

这些并不是您在计算机中表示数字的唯一方法,但它们可能是最流行的。一些较旧的计算机使用balanced ternary number system(尤其是Setun 机器)。还有one's complement format,最近不太流行。

【讨论】:

    【解决方案2】:

    零减一必须给出一些数字,这样如果你加一,你就会得到零。唯一可以加一并得到零的数字是以二进制表示的全为 1 的数字。所以这就是你得到的。

    只要您使用任何有效的算术形式,您就会得到相同的结果。如果有 8 辆汽车,而有人拿走了 3 辆汽车,那么无论您使用二进制、十进制还是任何其他表示形式进行数学运算,您得到的剩余箱数的值都应该是 5。

    因此,任何支持您正在使用的操作及其正常含义的有效表示系统都必须产生相同的结果。当您将表示设为 0 并使用表示为 1 执行减法运算时,您必须获得表示,以便当您向其添加 1 时,您得到的表示为零。否则,根据加法、减法、零、一等的定义,结果就是错误的。

    【讨论】:

    • 听说过 1 的补码表示吗?符号和大小?
    • @AnttiHaapala 我添加了另外两段来解释为什么你使用什么表示形式没有区别。这是一个关于操作的问题,与你如何表示这些值无关。
    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多