没什么难度大的,只是因为在教学的时候,老师总是在和你说如何求补码,而没有告诉你补码究竟是什么。
其实补码早在你小学、初中就已经接触过,只是当时叫另外一个名字,“两数互补“。如角A + 角B = 180度,那么角A 和 角B互补。如 -1 + 1 = 0 则-1和1互补等等。求互补数也就很简单了,如a + b = x,只要知道x的值和ab中任意1值,就可以求另一个值了
众所周知,计算机中只有0和1,那么要怎么用0和1来表示一个负数呢?当初的设计者们也是很聪明的,其实只要用 互补的性质 + 溢出就可以很简单的来统一正数和负数了。于是,就把负数在计算机中存在的形式称之为补码,而正数本来就可以直接用01来表示,不需要补码。这里就不长篇大论了,有兴趣可以去搜一下为什么可以用补码来统一正数和负数。
举个很简单的例子,如过你要在4位系统中求-1的补码,其实只要求1的互补数就行了,那么是关于多少互补的呢?4位系统可以表示的最大值为1111(15),16就溢出了,也就是关于16(2的4次方)互补的。代入上面说的a + b = x,很简单的求出b = 15,即-1的补码为15(1111)。由于二进制的特殊关系,也可以用取反+1来求补码,即源码1001,反码1110,补码=反码+1=1111(15)
(1)
-32767 32767
(2)
二进制 十六进制
-0xA原码:1000 1010
-0xA反码:1111 0101
-0xA补码:1111 0110 0xF6
(3)
补码:5BCD = 0101 1011 1100 1101
反码: 0101 1011 1100 1100
原码: 0010 0100 0011 0011 = 0x2433
补码:ABCD = 1010 1011 1100 1101
反码: 1101 0100 0011 0010
原码: 1010 1011 1100 1101 = -0x2BCD