为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕无忌1623718 2019-12-07 14:44:20
我只是很好奇,是否有原因要以二进制形式表示-1,使用二进制补码:翻转位并加1?-1由11111111(二进制补码)表示,而不是(对我来说更直观)10000001,后者是二进制1,第一位为负标志。免责声明:我的工作不依赖于二进制算法!
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

在我解释这个之前,让我们回到基础。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 number

Any 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数的同一位集合的歧义。


查看完整回答
反对 回复 2019-12-07
  • 3 回答
  • 0 关注
  • 690 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信