Nod*_*rov 1 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;
Run Code Online (Sandbox Code Playgroud)
所有这些1都来自哪里?有没有借到,因为所有位都0在zero变化.
这是一个很好的问题,与计算机如何表示整数值有关.
如果您在十分之一处写出负数,则只需写出常规数字,然后在其前面加上减号.但如果你在一台电脑里工作,一切都需要零或一,你就没有任何减号.然后问题就在于你如何选择代表负值.
一种流行的方法是使用带符号的二进制补码形式.这种方法的工作方式是使用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 + 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?
这些不是您在计算机中表示数字的唯一方法,但它们可能是最受欢迎的.一些较旧的计算机使用平衡三元数系统(特别是Setun机器).还有一种补码格式,这些日子并不受欢迎.