原码、反码和补码

本文由 程序喵正在路上 原创,CSDN首发!
系列专栏:计算机组成原理
首发时间:2022年9月10日
欢迎关注点赞收藏留言
一以贯之的努力 不得懈怠的人生

阅读指南

  • 引入
  • 原码
  • 反码
  • 补码
  • 为什么用补码来存储数据

引入

在计算机里面,都是以 补码 的形式来存储数据的

那么可能就会有小伙伴会问,那我们学习补码就行了,为什么还要学习原码和反码呢?

举个栗子,我们本来只会中文,但为了去阅读英文书籍学习英文,一种方法就是将英文书籍翻译成中文再来阅读,如果我们不会中文也就无法去学会英文

同样地,原码和反码也是学会补码的前提

原码

众所周知,一个字节就是 8 个位

直接讲概念可能不太好理解,下面我们以一个字节为例来说原码

最高位为符号位,0 代表正数,1 代表负数,后面的非符号位为该数字绝对值的二进制形式

以一个字节为例,那它的最高位,也就是第 7 位,如果是 0,表示这个数值位正数;如果是 1,表示这个数值为负数

来看一个具体的例子,5-5 两个数的原码分别为:0000 01011000 0101

反码

学会了原码之后,反码就变得很简单了

反码的规则是

正数的反码和原码一致;负数的反码是对原码按位取反,只是最高位(符号位)不变

我们还是来看 5-5 这个例子:

5 是正数,反码和原码一样,为 0000 0101

-5 是负数,最高位不变,依旧为 1,其他位取反,为 1111 1010

补码

最后我们来看补码

补码的规则是

正数的补码与原码一致;负数的补码是该数的反码加 1

我们还是来看 5-5 这个例子:

5 是正数,补码和原码一样,为 0000 0101

-5 是负数,其反码为 1111 1010,再加上 0000 0001,为 1111 1011

为什么用补码来存储数据

既然有原码、反码和补码,那为什么我们在计算机中要用补码来存储数据呢?

我们还是以 5-5 这个例子来看

学过计算机基础的小伙伴应该都知道,CPU 里面有加法器,什么是加法器啊?

就是里面会进行加法的运算

那么 CPU 里面有没有减法器啊?

其实,是没有减法器的,那计算机怎么进行减法呢?

比如,5 - 5 这个算式,我们可以将它转变为 5 + (-5),我们试着用原码来进行这个算式的计算

0000 0101
1000 0101
相加得到
1000 1010

根据我们刚刚学到的知识,来看一个这个计算结果,最高位为 1,表示这个数值是个负数,后 7 位表示的值为 10,即结果为 -10,这显然不对

接下来我们用反码来进行计算

0000 0101
1111 1010
相加得到
1111 1111

1111 1111 转变为原码,是 1000 0000,也就是 -0,有的小伙伴说那这样不就对了

但是你想一想,0000 0000 也表示 0,那我们这不就矛盾了,两个不一样的二进制数的值是一样的,所以用反码来表示也不行

最后,我们来试试补码

0000 0101
1111 1011
相加得到
1 0000 0000

因为一个字节只有 8 位,所以得把最高位的 1 去掉,也就是 0000 0000,符合我们的数学逻辑

你可能感兴趣的:(计算机组成原理,计算机组成原理,原码,反码,补码)