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

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都来自哪里?有没有借到,因为所有位都0zero变化.

tem*_*def 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 + 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机器).还有一种补码格式,这些日子并不受欢迎.