在8位二进制中从0减去1

时间:2017-10-04 17:38:42

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

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

  

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

所以,如果我有:

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

所有这些1来自哪里?由于0变量中的所有位均为zero,因此无需借用。

2 个答案:

答案 0 :(得分:5)

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

如果您在十分之一处写出负数,则只需写出常规数字,然后在其前面加上减号。但如果你在一台电脑里工作,一切都需要零或一,你就没有任何减号。然后问题就在于你如何选择代表负值。

一种流行的方法是使用签名的二进制补码。这种方法的工作方式是使用1和0来编写数字,除了那些1和0的含义与“标准”二进制在解释它们的方式上的区别。具体来说,如果您有一个带符号的8位数字,则低7位的标准含义为2 0 ,2 1 ,2 2 然而,最重要位的含义被改变:代替2 7 ,它代表值 -2 7

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

  

-2 7 + 2 6 +2 5 +2 4 + 2 3 < / sup> + 2 2 + 2 1 + 2 0

     

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

     

= -1

这就是这个比特集合代表-1的原因。

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

为了解决这个问题,我们可以选择说我们的整数值不是整数的真值,而是整数值的模数256.我们将存储的所有值都介于两者之间0和255,包括在内。

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

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

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

这些不是您在计算机中表示数字的唯一方法,但它们可能是最受欢迎的。一些较旧的计算机使用balanced ternary number system(特别是Setun机器)。还有one's complement format,这些日子并不受欢迎。

答案 1 :(得分:0)

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

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

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