我正在上计算机系统类(class),部分时间在Two's Complement苦苦挣扎。我想了解它,但是我读过的所有内容都没有为我带来帮助。我已经阅读了wikipedia article和其他各种文章,包括my text book。
因此,我想开始这篇社区Wiki 帖子,以定义Two's Complement是什么,如何使用它以及它如何在诸如强制类型转换(从有符号到无符号,反之亦然),按位操作和按位操作期间影响数字。轮类操作。
我希望得到的是一个清晰简洁的定义,程序员可以轻松理解。
最佳答案
Two's complement是一种存储整数的聪明方法,因此常见的数学问题非常容易实现。
要理解,您必须考虑二进制数。
它基本上说,
让我们尝试使用4位的小字节(我们将其称为nibble-1/2字节)。
0000
-零0001
-一个0010
-两个0011
-三个0100
到0111
-四到七个那是我们可以肯定的。 23-1 = 7。
对于底片:
1111
-负一1110
-负两个1101
-负三1100
到1000
-负4到负8 请注意,您获得了一个额外的负值(
1000
= -8),而不是一个正值。这是因为0000
用于零。这可以视为计算机的Number Line。区分正数和负数
这样做,第一位具有“符号”位的作用,因为它可用于区分非负十进制值和负十进制值。如果最高有效位是
1
,那么二进制可以说是负数,就好像最高有效位(最左边)是0
一样,您可以说十进制值是非负数。"Sign-magnitude"负数的正负号只是正负号的翻转,但是这种方法必须将
1000
(一个1
,然后是所有0
)解释为“负零”,这令人困惑。"Ones' complement"负数只是它们的正数对应物的位补码,这也导致
1111
(全为1)引起混淆“负零”。除非您与硬件非常接近,否则您可能不必处理Ones的补数或Sign-Magnitude整数表示形式。
关于binary - 什么是 “2'的补语?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1049722/