[Java入门系列]原码,反码,补码

原码,反码,补码

什么是原码呢?

原码:十进制数据的二进制表现形式,最左边的是符号位,0为正数,1为负数。

BIT的概念:

bit是“Binary digit” 的缩写,即二进制数字位。在数字系统中,所有信息最终都可被表示为一系列的“开”或“关”,“是”或“否”,“上”或“下”等二元状态。比特就是用来描述这种最基本的状态单位。

在计算机中,所有的数据最终都会被编码成为这样的比特序列。例如:字母“A”在ASCII编码中会被转换为数字65,而这个数字65又会进一步转换为一个8比特的二进制数(01000001)。这里的每一个“0”或“1”就是一个比特。

  • 1比特(bit)只能表示两种状态之一。
  • 8比特组成为一个字节(Byte),能表示从0到255(即2^8)之间的任意整数,这对于字母,数字,符号非常有用。
  • 计算机内存的大小,文件的大小等,本质上都是用比特(或其倍数单位如字节,千字节,兆字节等)来衡量的。

举例:

  56    ====>  0 0 1 1 1 0 0 0
十进制              二进制

最前面的1位是符号位,后面的7位是数据
  0      0 1 1 1 0 0 0 
符号位        数据

一个字节的最大值是多少
0 1 1 1 1 1 1 1
十进制为:127

原码的弊端:

十进制数据的二进制表现形式,最左边是符号位,0为正,1为负

利用原码对正数进行计算是不会有问题的。

但是如果是负数计算,结果就出错,实际运算的结果,跟我们预期的结果是相反的。

例如:

负一 : 1 0 0 0 0 0 0 1

如果负一加一的话,那么就是

负一 + 1 : 1 0 0 0 0 0 1 0

那么就变为了-2,正确答案应该0才对

什么是反码呢?
那么为了解决计算负数的问题,就出现了如下的反码。

反码:正数的补码反码是其本身,负数的反码是符号位保持不变,其余位取反。


计算规则:正数的反码不变,负数的反码在原码的基础上,符号位不变。数值取反,0变1,1变0。

核心知识点:
1、正数的反码不变。 原因是什么?反码的用处就是用来解决负数计算的,所以你在计算正数时,用不到反码。

2、反码是如何得到的?

在原码的基础上,符号位不变,其余位全部取反,也就是0变1,1变0

举例:

原码:
-56   1 0 1 1 1 0 0 0 

反码:1 1 0 0 0 1 1 1

反码 + 1 : 1 1 0 0 1 0 0 0

再将反码转为原码: 1 0 1 1 0 1 1 1

-55 的原码就是 : 1 0 1 1 0 1 1 1

如下图:如果计算的结果为负数,那么反码就不会有问题啦。

但如果是跨域0时,就会出现一个问题,因为0在原码与反码的表示中有两种表示形式,所以,只要当负数与正数进行计算,结果为正数时,都会导致值小了 1。

所以对于这种情况,创作者给出了补码的解决方案,请看下面

什么是补码呢?

解决有反码有两个0的情况

补码:正数的补码是其本身,负数的补码是在其反码的基础上+1。

 看下图:

举例:

-4 的源码 :1 0 0 0 0 1 0 0

-4 + 2 = -2

-4 的反码为:1 1 1 1 1 0 1 1

-4 的补码为:1 1 1 1 1 1 0 0

使用补码进行计算: +2 

+2 的结果为: 1 1 1 1 1 1 1 0

逆转

补码变反码:因为补码是反码加1得到的,所以逆转回去需要减一

1 1 1 1 1 1 0 1

在变为原码: 1 0 0 0 0 0 1 0

得到 -2

举例2:
 

-4 + 5 = 1

-4原码:1 0 0 0 0 1 0 0
1原码:0 0 0 0 0 0 0 1

直接用补码进行计算:

-4 补码: 1 1 1 1 1 1 0 0
5的补码: 0 0 0 0 0 1 0 1

相加的到的补码为: 0 0 0 0 0 0 0 1

转原码 : 0 0 0 0 0 0 0 1 
因为正数的原码等于反码等于补码

结果为 1

在计算机中的存储与计算中,都是使用补码。

注意:-128的由来就是因为补码  1 0 0 0 0 0 0 0 直接认定为 -128。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值