我在上一门计算机系统课程,在某种程度上,我一直在为“二的补充”而挣扎。我想了解它,但我所读到的一切并没有让我明白它的含义。我读过维基百科的文章和其他各种文章,包括我的课本。

什么是2的补数,我们如何使用它,它如何在强制转换(从有符号到无符号,反之亦然)、逐位操作和位移位操作等操作中影响数字?


当前回答

通过对给定数的第1个补数加1,可以求出两个补数。 假设我们要求出10101的两个补,然后求出它的一个补,也就是,在这个结果上加1,也就是,01010+1=01011,这就是最终答案。

其他回答

2对给定数的补数是1与1的补数相加得到的数。

假设我们有一个二进制数:10111001101

它的1的补位是:01000110010

它的2的补数是:01000110011

Two的补语主要用于以下原因:

避免0的多个表示形式 避免在溢出的情况下跟踪进位(如补位)。 进行简单的加法和减法运算变得很容易。

通过对给定数的第1个补数加1,可以求出两个补数。 假设我们要求出10101的两个补,然后求出它的一个补,也就是,在这个结果上加1,也就是,01010+1=01011,这就是最终答案。

简单来说,2的补码是一种在计算机内存中存储负数的方法。而正数则存储为普通二进制数。

让我们考虑这个例子,

计算机使用二进制数字系统来表示任何数字。

x = 5;

这表示为0101。

x = -5;

当计算机遇到-号时,它会计算出它的2的补数并存储它。

也就是说,5 = 0101,它的2的补是1011。

计算机处理数字的重要规则是,

如果第一位是1,那么它一定是负数。 如果除第1位之外的所有位都是0,那么它就是一个正数,因为在数字系统中没有-0(1000不是-0,而是正8)。 如果所有的位都是0,那么它就是0。 否则就是正数。

从数学的角度来看这两个补体系统是有道理的。在ten的补语中,这个想法本质上是“隔离”差异。

示例:63 - 24 = x

我们把24的补数相加,也就是(100 - 24)实际上,我们要做的就是在方程两边加100。

现在方程是:100 + 63 - 24 = x + 100,这就是为什么我们要去掉100(或10或1000或其他)。

由于必须从一长串零中减去一个数字的不方便情况,我们使用“减基数补”系统,在十进制系统中,9的补。

当我们看到一串大的9减去一个数时,我们只需要把数字倒过来。

例如:99999 - 03275 = 96724

这就是为什么在9的补数之后加1。你可能从儿时的数学中知道,9通过“偷走”1变成了10。所以基本上就是10的补位差减去1。

在二进制中,2的补数等于10的补数,而1的补数等于9的补数。主要的区别在于,我们不是试图用10的幂来分离差异(将10、100等添加到等式中),而是试图用2的幂来分离差异。

正是因为这个原因,我们把比特位颠倒。就像小数中的被减数是一串9一样,二进制中的被减数也是一串1。

例如:111111 - 101001 = 010110

因为1链比2的幂小1,它们从差值中“偷”了1,就像小数点中的9一样。

当我们使用负二进制数时,我们实际上是在说

0000 - 0101 = x

1111-0101 = 1010

1111 + 0000 - 0101 = x + 1111

为了“分离”x,我们需要加1,因为1111离10000只有1,我们去掉前导的1,因为我们只是把它加到原始的差值上。

1111 + 1 + 0000 - 0101 = x + 1111 + 1

10000 + 0000 - 0101 = x + 10000

只要两边都去掉10000就得到x,这是基本的代数。