我在上一门计算机系统课程,在某种程度上,我一直在为“二的补充”而挣扎。我想了解它,但我所读到的一切并没有让我明白它的含义。我读过维基百科的文章和其他各种文章,包括我的课本。
什么是2的补数,我们如何使用它,它如何在强制转换(从有符号到无符号,反之亦然)、逐位操作和位移位操作等操作中影响数字?
我在上一门计算机系统课程,在某种程度上,我一直在为“二的补充”而挣扎。我想了解它,但我所读到的一切并没有让我明白它的含义。我读过维基百科的文章和其他各种文章,包括我的课本。
什么是2的补数,我们如何使用它,它如何在强制转换(从有符号到无符号,反之亦然)、逐位操作和位移位操作等操作中影响数字?
当前回答
你也可以使用在线计算器来计算一个十进制数的补二表示:http://www.convertforfree.com/twos-complement-calculator/
其他回答
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
2对给定数的补数是1与1的补数相加得到的数。
假设我们有一个二进制数:10111001101
它的1的补位是:01000110010
它的2的补数是:01000110011
2的补语:当我们用一个数字的1的补语加一个额外的1时,我们将得到2的补语。例如:100101,它的1的补足是011010和2的补足是011010+1 = 011011(通过与1的补足相加) 本文以图解的方式对此进行了解释。
Two的补码是一种存储整数的聪明方法,因此常见的数学问题很容易实现。
为了理解,你必须把数字想象成二进制。
它基本上是说,
对于0,用所有的0。 对于正整数,开始计数,最大值为2(位数-1)-1。 对于负整数,做完全相同的事情,但是切换0和1的角色并开始倒数(所以不是从0000开始,而是从1111开始——这是“补”部分)。
让我们尝试一个4位的迷你字节(我们称之为1/2个字节)。
0000 -零 0001 - 1 0010 - 2 0011 - 3 0100到0111,4点到7点
这是我们目前能找到的阳性结果。23-1 = 7。
负面影响:
1111 - 1 1110 - 2 1101 - 3 1100到1000 - - 4到- 8
注意,负数(1000 = -8)有一个额外的值,而正数没有。这是因为0000用于表示零。这可以看作是计算机的数轴。
区分正数和负数
这样一来,第一个位就扮演了“符号”位的角色,因为它可以用来区分非负的十进制值和负的十进制值。如果最高有效位是1,那么二进制就可以说是负的,如果最高有效位(最左边)是0,就可以说十进制值是非负的。
“符号量级”的负数只是将它们的正数对应的符号位颠倒了,但这种方法必须处理将1000(一个1后面跟着所有的0)解释为“负零”,这是令人困惑的。
“1的补”负数只是它们的正数的位补,这也导致了“负零”和1111(都是1)的混淆。
除非你的工作非常接近硬件,否则你可能不需要处理个位补或符号幅度整数表示。
最简单的答案:
1111 + 1 =(1)0000。所以1111一定是-1。那么-1 + 1 = 0。
理解这些对我来说是完美的。