我在上一门计算机系统课程,在某种程度上,我一直在为“二的补充”而挣扎。我想了解它,但我所读到的一切并没有让我明白它的含义。我读过维基百科的文章和其他各种文章,包括我的课本。
什么是2的补数,我们如何使用它,它如何在强制转换(从有符号到无符号,反之亦然)、逐位操作和位移位操作等操作中影响数字?
我在上一门计算机系统课程,在某种程度上,我一直在为“二的补充”而挣扎。我想了解它,但我所读到的一切并没有让我明白它的含义。我读过维基百科的文章和其他各种文章,包括我的课本。
什么是2的补数,我们如何使用它,它如何在强制转换(从有符号到无符号,反之亦然)、逐位操作和位移位操作等操作中影响数字?
当前回答
Two的补语主要用于以下原因:
避免0的多个表示形式 避免在溢出的情况下跟踪进位(如补位)。 进行简单的加法和减法运算变得很容易。
其他回答
最简单的答案:
1111 + 1 =(1)0000。所以1111一定是-1。那么-1 + 1 = 0。
理解这些对我来说是完美的。
2对给定数的补数是1与1的补数相加得到的数。
假设我们有一个二进制数:10111001101
它的1的补位是:01000110010
它的2的补数是:01000110011
你也可以使用在线计算器来计算一个十进制数的补二表示:http://www.convertforfree.com/twos-complement-calculator/
简单来说,2的补码是一种在计算机内存中存储负数的方法。而正数则存储为普通二进制数。
让我们考虑这个例子,
计算机使用二进制数字系统来表示任何数字。
x = 5;
这表示为0101。
x = -5;
当计算机遇到-号时,它会计算出它的2的补数并存储它。
也就是说,5 = 0101,它的2的补是1011。
计算机处理数字的重要规则是,
如果第一位是1,那么它一定是负数。 如果除第1位之外的所有位都是0,那么它就是一个正数,因为在数字系统中没有-0(1000不是-0,而是正8)。 如果所有的位都是0,那么它就是0。 否则就是正数。
2的补码对于查找二进制值非常有用,但是我想到了一个更简洁的方法来解决这样的问题(从未见过其他人发布它):
以二进制为例:1101(假设空格“1”是符号)等于-3。
使用2的补码,我们可以这样做…翻1101到0010…加上0001 + 0010 ===>得到0011。0011的正二进制= 3。因此1101 = -3!
我意识到:
而不是所有的翻转和加法,你可以只做一个基本的方法来解决正二进制(假设0101)是(23 * 0)+(22 * 1)+(21 * 0)+(20 * 1)= 5。
用否定句做同样的概念!(稍微扭曲一下)
以1101为例:
对于第一个数字,用-(23 * 1)= -8代替23 * 1 = 8。
然后像往常一样,做-8 + (22 * 1)+ (21 * 0)+ (20 * 1)= -3