[英]Subtracting 1 from 0 in 8 bit binary
我有8位int zero = 0b00000000;
和8位int one = 0b00000001;
根据二元算术规则
0-1 = 1(从下一个有效位借位1)。
所以,如果我有:
int s = zero - one;
s = -1;
-1 = 0b1111111;
所有这些1
s来自何处? zero
变量中所有位均为0
,因此无需借用。
这是一个很大的问题,与计算机如何表示整数值有关。
如果您要写一个以10为底的负数,则只需写出常规数,然后在其前面加上减号即可。 但是,如果您在计算机中工作,而一切都必须为零或一,那么您将没有任何负号。 接下来的问题是如何选择代表负值。
一种流行的方式是使用带符号的二进制补码形式 。 这种工作方式是用一和零来写数字,除了这些一和零的含义与“标准”二进制在解释方式上有所不同。 具体而言,如果有符号的8比特数,低7位具有其标准含义为2 0,2 1,2 2,等等。然而,最显著位的含义被改变:代替表示2 7,它代表值-2 7 。
因此,让我们看一下数字0b11111111。 这将被解释为
-2 7 + 2 6 + 2 5 + 2 4 + 2 3 + 2 2 + 2 1 + 2 0
= -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1
= -1
这就是为什么此位集合表示-1的原因。
还有另一种解释这里发生的事情的方法。 鉴于我们的整数只有八个位可以使用,因此我们知道无法表示所有可能的整数。 如果选择任何257个整数值(假设只有256种可能的位模式),则无法唯一表示所有这些数字。
为了解决这个问题,我们可以替代地说,我们将使整数值不代表整数的真实值,而是代表该整数模256的值。我们将存储的所有值都将在0到255之间, 包括的。
在这种情况下,0-1是多少? 它是-1,但是如果我们采用该值mod 256并将其强制为非负值,那么我们将获得-1 = 255(mod 256)。 您将如何以二进制形式写255? 是0b11111111。
如果您有兴趣的话,可以在这里学习大量其他有趣的东西,因此,我建议您阅读带符号和无符号的二进制补码。
作为一些练习:这种格式的-4是什么样的? -9怎么样?
这些不是在计算机中表示数字的唯一方法,但它们可能是最受欢迎的方法。 一些较旧的计算机使用平衡三进制数系统 (特别是Setun计算机)。 还有一种补码格式 ,这种格式在当今并不流行。
零减去一个必须给予一定的数量,例如,如果你添加一个到它,你就会得到零。 你可以添加一个,并得到零的唯一数字是用二进制为全1代表之一。 所以这就是你所得到的。
只要你用算术任何有效的形式,你会得到相同的结果。 如果有八辆车,有人带走了三辆车,你会得到剩下多少情况下,值应为五,无论你做数学题,用二进制,十进制,或任何其他类型的代表。
因此,任何以正常含义支持您正在使用的操作的有效表示系统都必须产生相同的结果。 当你把零表示,并使用表现为一个执行减法运算,你必须得到表示,例如,当你添加一个到它,你就会得到零表示。 否则,基于加,减,零,一等的定义,结果就是错误的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.