为什么对带符号的数字宁愿用二进制补码,也不用符号和幅值?

我只是很好奇,是否有原因要以二进制形式表示-1,使用二进制补码:翻转位并加1?

-1由11111111(二进制补码)表示,而不是(对我来说更直观)10000001,后者是二进制1,第一位为负标志。

免责声明:我的工作不依赖于二进制算法!


慕无忌1623718
浏览 698回答 3
3回答

慕的地6264312

在我解释这个之前,让我们回到基础。2'补码是1的补码+ 1。现在,什么是1的补码,以及它的意义又是什么。任何n位数字及其1的补数之和为您提供了可以由这些n位表示的最大数字。例: 0010 (2 in 4 bit system)+1101 (1's complement of 2)___________________________ 1111  (the highest number that we can represent by 4 bits)现在,如果我们尝试将结果再加1,将会发生什么。这将导致溢出。结果将1 0000是0(因为我们正在处理4位数字,(左侧的1是溢出)所以,Any n-bit number + its 1's complement = max n-bit numberAny n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)然后有人决定将1的补码+ 1称为2'补码。因此,上面的语句变为:任何n位数字+它的2的补码= 0,这意味着一个数字的2的补码=-(该数字的)所有这一切又产生了一个问题,为什么我们只能使用n位中的(n-1)代表正数,为什么最左边的n位代表正负号(最左边的0代表+ ve数,而1意味着-ve号)。例如,如果第32位为1,则为什么仅使用java中int的前31位表示正数,即它的a -ve数。 1100 (lets assume 12 in 4 bit system)+0100(2's complement of 12)___________________________1 0000(结果为零,进位1溢出)因此,(n的n + 2'的补数)= 0的系统仍然有效。这里唯一的歧义是2的12的补码是0100,除了2s补码系统中表示-12之外,它也歧义地表示+8。如果正数的最左位始终为0,将解决此问题。在那种情况下,它们的2的补码在其最左边的位将始终为1,并且我们不会出现表示2的补码和+ ve数的同一位集合的歧义。
打开App,查看更多内容
随时随地看视频慕课网APP