我正在上一台计算机系统课程,并且在某种程度上一直在努力与Two’s Complement交流。我想了解它,但是我读过的所有内容都没有为我带来帮助。我已经阅读了维基百科的文章以及其他各种文章,包括我的教科书。
因此,我想开始这个社区Wiki帖子,以定义Two’s Complement是什么,如何使用它以及它如何在诸如强制类型转换(从有符号到无符号,反之亦然),按位操作和移位操作等操作期间影响数字。
我希望有一个清晰简洁的定义,使程序员容易理解。
658
二进制补码是一种存储整数的聪明方法,因此常见的数学问题很容易实现。
要理解,您必须考虑binary中的数字。
它基本上说,
对于零,请使用全0。 对于正整数,开始递增计数,最大值为2 (位数-1) -1。 对于负整数,请执行完全相同的操作,但是请切换0和1的角色(因此,与其以0000开头,不以1111开头-这是“补码”部分)。 让我们尝试使用4位的迷你字节(我们将其称为半字节-1/2字节)。
这是我们可以肯定的。
对于底片:
请注意,对于负数(1000= -8),您将获得一个额外的价值,而对于正数则得到一个额外的价值。这是因为0000用于零。这可以视为计算机的编号行。
(1000= -8)
区分正数和负数
这样做,第一位具有“符号”位的作用,因为它可用于区分非负十进制值和负十进制值。如果最高有效位是1,则二进制可以说是负数,而最高有效位(最左边)是0,则可以说十进制值是非负数。
“符号幅度”负数的正负号只是正负号的翻转,但是这种方法必须将解释1000(一个1后跟所有0s)解释为“负零”,这令人困惑。
“ 1的补码”负数只是其正的对应数的位补码,这也导致“负0”与1111(全1)混淆。
除非您与硬件非常接近,否则您可能不必处理Ones的补数或Sign-Magnitude整数表示形式。