原码、反码和补码

一.机器数和真值

在学习原码、反码和补码之前,我们需要了解机器数和真值的概念。

1. 机 器 数

计算机会将一个数以二进制的方式进行储存,称为机器数。机器数有一些是带符号的,也有一些是不带符号的。在这里,我们讨论带符号的机器数。带符号的机器数的最高位存放符号,正数是0,负数是1。(可以用(-1)^0=1,(-1)^1=-1理解为什么正数负数符号位分别为0和1)

2. 真 值

第一位是符号位,所以机器数的形式值就不等于真正的数值。例如10000011,其中最高位的1表示负,其真正的数值是-3而不是形式值131(10000011转换成十进制是131)。所以为了区别起见,将带有符号位的机器数对应的真正数值成为机器数的真值。

二。什么是原码反码补码,怎么计算?

计算机要使用一定的编码方式进行储存。原码,反码和补码是机器存储一个具体数字的编码方式

 原 码

原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值

反 码

1.正数的反码是其本身。2.而负数的反码就是在其原码的基础上,符号位不变,其余的位取反。

+1 = 0000 0001[原] = 0000 0001[反]

-1  = 1000 0001[原] = 1111 1110[反]

补 码

1.正数的补码是其本身。 2.负数的补码就是在其原码的基础上,符号位不变,最后+1.(即在反码的基础上+1)

三.为什么要使用原码反码和补码?

计算机使用三种编码方式储存一个数,对于整数来说三种编码方式的结果都相同就不过多解释,然而,对于负数来说。

-1  = 1000 0001[原] = 1111 1110[反]

原码、反码和补码截然不同,那为什么有反码和补码呢?

对于人脑来说,在运算时辨别符号位和真值是个简单的任务,但是对于计算机而言,要设定符号位可能会使计算机的电路设计变得复杂,所以有了用最高位表示符号位这个方式,并且有了让符号位参与运算的方式。

1 - 1 = 1 + (-1)= 0000 0001[原] + 1000 0001[原] = 0000 0001[反] + 1111 1110[反] = 1111 1111[反] = 1000 0000[原] = -0

 人们发现,用反码计算减法,结果的真值部分是正确的。而唯一的问题出现在“0”这个特殊的数值上。虽然人们理解上的+0和-0是一样的。但是0带符号是没有任何意义的,而且会有0000 0000[原]和1000 0000[原] 两个编码表示0

补码的出现,解决了-0的符号以及两个编码的问题:

1-1 = 1+(-1) = 0000 0001[原] + 1000 0001[原] = 0000 0001[补]+1111 1111[补] = 0000 0000[补] =0000 0000[原]

这样0用0000 0000表示,而以前出现的问题的-0已经不存在了,而且可以用1000 0000来表示-128

(-1) + (-127) = 1000 0001[原] + 1111 1111[原] = 1111 1111[补] + 1000 0001[补] = 1000 0000[补](-128没有原码和反码,相对应的,0也没有反码和补码,+0和-0才有)

使用补码,不仅修复了0的符号以及存在的两个编码的问题,而且还能多表示一个数。这就是为什么8位二进制,使用原码或者反码表示的范围为[-127,+127],而使用补码表示的范围为[-128,127]

int 类型的值也是同理,可以表示的范围是[-2^31,2^31-1],因为第一位表示的是符号位,而使用补码表示时又可以多保存一个最小值。

总结:

为了解决计算机负数运算的问题,符号位出现了;为了解决负数相减,反码出现了;反码进行相减运算时出现了两个问题—— -0和+0无意义,而且0000 0000[原]和1000 0000[原]表示同一个数,补码出现了;补码出现了,问题被解决了,同时表示的范围又大了一个,一举多得。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值