一篇文章带你弄懂原码、反码和补码及其由来

很多人在学习计算机以及编程时,都会接触到原码,反码和补码,今天来聊聊它们的表示方法以及为什么会有这几个概念。

一、机器数

说起原码,得先说起机器数和计算机的硬件结构,人们认为,一个完整功能的计算机主要由五大组成部分:运算器、控制器、存储器、输入设备和输出设备,其中担负着执行各种算术和逻辑运算操作的部件即运算器,而现代计算机芯片主要由数字集成电路搭建的,数字集成电路通过控制其算术逻辑单元中的逻辑门产生高、低电平的电信号,可实现逻辑上的0、1,即用高电平代表数字1,低电平代表数字0,这样,计算机就实现了从物理信号到逻辑信号的转变。

不过计算机只能表示0和1,而我们使用计算机是为了解决现实生活中的问题,因此为计算机使用二进制,可与现实中使用的十进制进行一一转换。我们将一个数在计算机中的二进制表示形式, 叫做这个数的机器数,而早期人们因为编码习惯及方便,将计算机中一个字节定义为8位,比如十进制中的5的机器数为00000101。

二、原码

与此同时,人们发现,使用0和1我们只能在计算机中表示正数,为了方便使用,规定机器数的第一位为符号位,比如-5可以表示成-0000101,这种带符号的机器数我们叫做真值,我们以0代表符号“+”,以1代表符号“-”,因此上文-5的机器数即为10000101。

而这种将真值形式的“+”号用“0”表示,“-”号用“1”表示的形式,叫做数的原码形式,简称原码

三、反码

了解了原码,我们再来说说反码,为什么会出现反码这个概念,首先咱们都知道原码的第一位是符号位, 我们自己在计算的时候会根据符号位选择正负数,再计算后面的部分,但是对于计算机,计算时要辨别符号位将会使硬件变得格外复杂或增加大量健壮性代码,于是人们想着将符号位也纳入计算。

但是,直接使用原码进行计算将会出现很多错误,比如,使用原码计算1-1的时候将会出现以下问题:

1 = [00000001]原

-1 = [10000001]原

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

我们知道,1-1应该等于0而不是-2,通过原码进行计算很显然会引发各种错误。

为了解决这个问题,通过探究发现,在计算时,将负数的符号位不变,后面真值部分按位取反,而正数的反码不变,这样就可以得出正确的结果,这样转换后的机器码我们称之为反码

1 = [00000001]原 = [00000001]反

-1 = [10000001]原 = [11111110]反

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [00000001]反 + [11111110]反 = [11111111]反 = [10000000]原 = -0

四、补码

在上文反码的计算中,我们发现计算结果在真值位上是正确的,而问题出现在符号位上,因为0带符号并没有任何意义,并且我们会发现有[00000000]和[10000000]两种形式来表达0,这样在计算机的应用中明显会出现很多问题,于是人们通过研究提出了补码这一概念:正数的补码依然是其本身,而负数的补码在其反码上+1

1 = [00000001]原 = [00000001]反 = [00000001]补

-1 = [10000001]原 = [11111110]反 = [11111111]补

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [00000001]补 + [11111111]补 = [00000000]补 = [00000000]原 = 0

这样,0就只有唯一的机器码[00000000],并且我们刚好可以用[10000000]来表示-128,这也是为什么byte的取值范围是-128到+127的原因。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LionelBW

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值