关于反码和补码的一点思考

如有侵权,请作者尽快联系我,我会第一时间删除本文。

一直没搞懂为什么需要反码和补码,在网上查资料的时候看到了下面这篇。

原码, 反码, 补码 详解

关于反码和补码的优势讲得很好懂,不过文章的后半段关于余和模的描述,看完之后总觉得没看明白。评论中提到了下面的文章

signed-binary-numbers
(简单翻译放在下面,原版请参考上面的链接。)

两篇文章对照看完后,把自己的想法写在下面。

1.补码的取得方式

第一篇文章中是,补码的取得方式是通过(反码+ 1)。
而在第二篇文章中是 (模 -原码),结果虽然一样,但是明显前一种更符合人脑的理解习惯,但是后一种却是在真实电路中的处理方式。

补码 = 反码 + 1 ,这也很好的解释了为什么在二进制中对于一段取值范围负数会比正数多一。比如在java中,Integer类型的取值范围是 -2147483648 到 2147483647 也就是 -231 到 231-1。因为0是在正数的范围内表示(0的二进制代码的最高有效位MSB是0)。

2.反码的符号位

第一篇文章中,负数的反码是原码保留最高有效位msb不变,其他位按位取反。第二篇文章中是将这个负数对应的正数的原码全部取反,包括msb。
其实是一个意思。负数的原码中的符号位 和 负数对应正数取反之后的符号位都是 1。

3.正0和负0

不论哪种计算方式,都是通过溢出一位,然后忽略溢出位的方式,得到相同的一个二进制代码。


在数学中,正数(包括零)表现为没有符号的数字。我们不在他们前面放上一个正号(+)来显示他们是正数。

但是当处理负数时,我们在数字前面加上一个负号(-)来表示这个数字是负数,并且和无符号的正数相区别。带符号的二进制数也是同样的。

然而,在数字电路中,并没有规定一个加号或者减号来标识一个数字。因为在数字系统中用二进制数字(0 和 1)来进行操作,在微电子学中被使用时,这些0和1 被叫做一个比特(bit,来自BInary digiT的缩写)。分成特定范围大小的数字被叫做一些通用的名字,比如字节(byte) 或者字(word)。

我们之前看到过,一个8bit的数字的取值范围是从 0(00000000) 到 255(11111111),每一个8bit字节都有28,256个不同的组合。

所以,比如有一个无符号位的二进制数01001101 等于十进制的77。但是数字系统和计算机必须和处理正数一样很好的处理负数才行。

在数学上,数字通常由符号和值组成。符号表明数字是正或者是负,而值表示了数字的大小。比如23,+156 或者-274。现代数字是这种被叫做”符号大小表示法”(

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值