有理有据详谈计算机的原码、反码、补码

本文详细介绍了计算机中整型数据的原码、反码和补码表示,特别是负数的补码计算方式。通过加法实现减法的原理,阐述了补码的由来和数学解释。强调了补码在计算机存储和运算中的重要性,以及正数和负数在不同码制下的表示。此外,还提到了早期计算机发展中的计算方式,如帕斯卡计算器和莱布尼兹的贡献,以及从机械计算到电子计算机的演变。
摘要由CSDN通过智能技术生成

有理有据的详谈计算机的原码、反码、补码

前言

本文主要谈论整型类型存储的原码、反码、补码。

重点

实际上重点需要了解的就是负数的补码,以及其范围相关的理解和解释。本文将从熟知的负数的补码是其正数的原码取反加一的由来和其数学解释开始

正文

1.最开始出现的是正数的码制。
正数存储的二进制码制就是其本身的二进制,这也是人们最开始使用的,这个很简单,就像让你开一盏灯,你肯定选你最近的,同样设计者也是选择最开始的最让人理解的解释(至于为什么是采用二进制可以看末尾),实际上原码不存在设计,就是单纯的用二进制表示一串数据而已,正数和负数怎么区分?用一个bit作为区分,但是如果负数也这样得到的结果就不正确了,所以负数该怎么表示?

2.加法实现减法
优先谈论加法实现减法,是因为我认为计算机的发展中这种数学思路应该和负数的存储形式有一定共鸣。最开始的计算机是没有减法器的,只有加法器,但是计算过程中不能只有加法,于是就开始探讨使用加法器实现减法器。

首先就是从实际出发,可以实现的情况下进行的运算,也就是位运算,于是就有了这个数学表达式

~B=2^n-1-b
B表示存储的寄存器,b表示a-b中的b(a,b均是正数,因为这是在探讨负数的过程,只能基于现有的)n表示位长。

根据这个得到减b的表达式:-b=~B+1-2^n(注意是减b表示负b),而对于计算机来说寄存器就只有规定的大小,也就是n,所以 2^n就是模(模,可以理解成极限,例如钟表,模就是12,超过就是留余,例如,16点,也就是下午4点),所以实际上来说-b=~B+1(但这是实际值,或者说推导式,上面是定义式)

3.减法都实现了,负数的补码?
也许有人说补码不就是和减b一样吗?至少数学上来说这样没什么,但是不严谨。但是上面模的概念给了很好的解决定义办法,两个互补的数相加等于模,为了确保这一点,负数补码的定式为

2^n-|x| -2^(n-1)<=x<=0,n机器长度
也就是负数的补码用这个计算就不存在错误
同时计算机直接操作补码,正数和负数补码的和刚好等于模,实际显示由于位长也就是0

同样将加法实现减法的式子带入,可以得到-b=~B+1,也就是常说的取反加一的由来,但是这是推导,并不是定义,从定义看,对于char而言范围是(-128,127),消除了负0,进行了0的统一。
按照定义来说

0是1 0000 0000
-128是 1 0000 0000减去0 1000 0000 也就是0 1000 0000

4.原码
和上面说的一样,原码就是按照人基本的学识用二进制表示一个数据,这也是当我们在计算的数值在原码的范围内时是正常(人的思维的计算),而补码的范围无法参考的一个理由,而且这也是其存在负0不存在-128的根源,当最高表示符号的时候,就存在这个,但是占用资源,补码就对其进行了统一去除了负0。原码的存在更多是为了补码服务。原码的范围是

-(2^n-1)到 2^n-1 ,n是定点整数位数
char范围是-127-127

5.反码
如果说原码是按照人的思维去思考的表达,那么反码的实际存在就是为了更好的理解或者计算补码这个“反人类的思维设计”而产生的一个词汇。范围和原码一至,就是原码取反。

注意

1.所有数据均是以补码的形式存储的。
2.正数的原码就是其补码,负数的补码不是原码。
3.计算超出原码范围的数据要用补码进行运算。
4.原码取反加一等于补码这句话存在瑕疵。例如:负0求补码,会产生混乱。

补充

第一台通用计算机:https://baike.baidu.com/item/ENIAC/431133?share_fr=pc_qzone
第一台计算机:https://baike.baidu.com/item/ABC%E6%9C%BA/8700905?share_fr=pc_qzone

从算盘到机械计算机
帕斯卡计算器:补九码,将减法弄成了加法
莱布尼兹:1671年,莱布尼兹发明了能进行四则运算的机器,并发明了莱布尼兹论来解决进制问题;
发明了二进制;灵感来自中国的八卦
- 从机械计算机到电子计算机
ENIAC;第一台真正意义上的电子计算机;宾夕法尼亚大学;冯·诺依曼后期参与
特点:采用十进制;使用电子管;无键盘、鼠标等输入设备,不存储程序;应用领域:科学计算
运算速度:每秒5000次;不是冯·诺依曼机器;
- 布尔:布尔运算
但是十进制计算和实现都很麻烦,成本也相对较高,所以后面换成二进制,而不是一开始就一直是二进制。

结束语

如果有什么疑问或者其他,欢迎留言,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@矛盾综合体

感觉有帮助可以点个赞哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值