计算机数据运算及存储|二进制补码,反码,原码

前言

由于计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储,称之为位模式。它是0和1的组合,每一位就相当于一个电子开关。

为了解决计算机做减法和引入符号位的问题,随着发展产生了有符号数值的三种二进制表示法,分别是原码、反码、补码。

 

三种表示法均有符号位与数值位,即占有一位表示数值符号,其余表示数值的绝对值(负数的反码与补码表示的位模式结果与原码表示的位模式是不同的)。我们通常将以原码表示的称之符号加绝对值表示法。

在计算机中存储负数存储负数的补码表示法,利用补码就不用考虑负数的运算了,减法运算都可以用加法来完成。简化了运算,提高了运算效率。

计算机存储-二进制表示法

原码

原码即按照二进制位置化数字系统,得到该数值的位模式所对应的等值十进制数。

公式为计算机数据运算及存储|二进制补码,反码,原码 (R为整数的位数, 2 为数的位数)。

反码

反码即原码按位取反。

补码

在计算机中以补码表示法来存储负数,利用补码就不用考虑负数的运算了,减法运算都可以用加法来完成。简化了运算,提高了运算效率。

补码表示法可以通过两种运算方法得到。

第一种补码运算方法分为两步,从位模式的第一位即最右边位依次向前复制,直到有1被复制,接着,对其余未复制的位进行取反。

如1010转成补码-》复制0,遇到1复制1,取反0与1。结果为0110。

第二种方法就是大家最常听过的7字口诀:按位取反再加一。

两个运算方法得到的结果是一样的,因为它们的本质是没任何区别的。取反再加1,遇到原码位为0,补码位1的位,会一直向前进位。直到遇到原码位为1,补码位为0的位停下来,其余位取反。这里就充分解释了第一种简单粗暴的运算为什么到1停止复制,其余位取反的原因了。

注意:

这里要特别说明的是,取补的这个运算,在计算机存储二进制补码过程是不考虑符号位的,即符号位不参与取补运算。而像如上的示例没有说明需要把数值以二进制存储在计算机中以及包括后面要讲得实数的算数运算中的取补运算都需要考虑符号位。这个概念非常重要,然而很多人都很模糊。于是乎大家在网上会看到两种论点“正数没有补码和反码的概念”、“正数的反码与补码就是原码”。笔者刚开始看到这两个论点,也是一脸懵逼。甚至有的书上也有侧面说明了“正数的反码与补码是原码”这个论点。但笔者认为这种论点的产生可能是因为编者为了方便教学和理解数据运算,所以直接统一定义计算机中数值都是以补码表示法存储的,包括正数。笔者我不认为是这样的,虽然在计算机底层的操作层面上来看,哪种说法正确显然不是很重要了,毕竟说法是人提出来的。但对于计算机专业的学生来说,知道一个更为准确的说法,从而可以更深入了解,构建一个强有力的知识体系。

笔者观点

笔者认为“正数以二进制原码存储,不以二进制补码或反码存储。而负数以二进制补码存储在计算机中。”,也就是说在计算机存储中,只有负数会以二进制补码形式存储下来。而存储正数没有用反码或补码表示法存储的概念。正数与负数进行加减算数运算时正数以二进制原码的存储形式与负数的二进制补码存储形式进行运算,得到的结果需要被存储到内存中,所以运算得出的结果也是一个存储形式的位模式。要想得到书面形式的二进制原码,通过判断符号位,可知道正数还是负数,亦可知道是存储形式是二进制原码还是补码。若是补码即对结果再取补即可。(不存储,所以这里取补运算忽略符号位)。

之所以会这么认为,是因为笔者认为反码与补码的概念是根据它们的运算过程来提出的。显然正数的存储没有进行任何额外的运算,怎么能说“正数的补码和反码就是原码”呢?而无论是正数还是负数在计算机中都可以进行补码和反码运算,又怎么能说正数没有反码和补码的概念呢?

当然我的观点不一定正确,若你认为有误或有其他的看法,欢迎留言讨论。

2023.2.26 16:00 数据运算部分有空再更新。


数据运算

 

给TA打赏
共{{data.count}}人
人已打赏
开发

VsCode解决控制台输出中文出现乱码问题

2023-9-15 8:42:49

开发

C/C++排序篇-冒泡排序

2023-9-15 9:00:14

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索