从数学原理深入理解原码,反码,补码

在我们进行计算机的知识学习过程中,很多基础教材一开始就向我们介绍计算机的三种编码,即原码,反码,补码三种形式;相信大家对这三种编码都会多少留有印象,事实上,计算机的存储系统以比特(bit)以基本单位,一个比特代表一个0或1,很多很多的比特来共同完成计算机的内部存储。由于这种存储结构只能储存二进制的数字,原码,反码,补码就是计算机储存实际数字的方法!
1.原码的第一个比特位为数字符号位,0表示正数,1表示负数,后面位数为十进制数字的二进制表示;
2.负数的反码为原码的除第一个符号位之外,其他的位置数字全部取反;正数的反码不变;
3.负数的补码为反码除符号位的二进制数字再加1,即补码为原码取反再加1;正数的补码不变。
这样的定义基本上会出现在每一本计算机入门书籍或是涉及到计算机的内部存储结构的书籍上,但是为什么要这样子定义三种编码,这样子定义又有什么样的好处呢?本文将从数学原理的角度向读者深入的揭示三种编码的奥秘!

一、原码与正数加法

事实上,对于一台计算机而言,对所有的数字只是单纯的支持加法(对二进制做减法过于复杂,因此计算机只有加法器的实现),即二进制的传统加法满一进一法则;而对于减法操作,计算机采取的方法是让减数加上被减数的相反数来实现的。因此在我们的讨论中只考虑正数的加减,这样就可以把所有的加减操作全部覆盖了。
由于计算机只可以对加法进行操作,即计算机本身是不认识所谓的正数和负数的,它只会对两个数字进行盲目的二进制相加;我们以16个比特存储单位为例,他的二进制存储可以表示的数字范围为
0 ≤ x < 65535 0\leq x<65535 0x<65535
因此,我们要成功表示负数的目的就是建立二进制数字与实际数字的一个双向映射,他能够将一些二进制数映射为不同的正数,将另一些二进制数映射为不同的负数;我们很容易想到的就是将所有的二进制数字直接分成两个部分,通过如下规则完成映射
f ( x ) = { x ( x < 32767 ) 32768 − x ( x > 32367 ) f(x)=\left\{ \begin{aligned} x(x<32767)\\ 32768-x(x>32367) \end{aligned} \right. f(x)={ x(x<32767)32768x(x>32367)
事实上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值