原码、反码、补码,Java中byte类型的‘-128‘对应的二进制是什么。

模运算

模、同余数,
像生活中的时钟,
转一圈12个小时,走过了12就会重新从0开始算,
这里的12称之为模。

假设现在时针停留在3点钟的位置,如何把时针拨到6点钟位置:
1、顺时针移动3;
2、逆时针移动9。
加3和减9在一定程度上来看是等效的,
3和9被称作同余数,它们之和等于模。

在时钟里,减去一个数等于加上这个数的同余数,叫做模运算。

二进制

计算机中只能存放0和1,对应集成电路中的开关。
二进制如何计算的:
2的n次方,n是下标,从0开始,从右到左,乘号前的数是对应位置上的0或1,求和。
在这里插入图片描述

原码

前面不确定长度的二进制数据存在内存中,如何去读是一个问题。
所以有了数据类型,数据类型在设计之初就明确表示,
计算机基本数据必须是定长的,且有两部分组成,
最左边的符号位(0代表负、1代表正),剩下的位置存储二进制。

不同数据类型的长度也不一样,
例如Java的数据类型:
在这里插入图片描述
这样计算机知道类型后,比如byte,就每次读八位作为一个变量。

byte类型的10:0000 1010,-3:1000 0011。

byte的最大值:

0111 1111 = 2^0+2^1+2^2+2^3+2^4+2^5+2^6+2^7 = 2^8-1 = 127,

这就是为什么byte的取值范围是[-128, 127],-128我们后边再说。

计算机运算
计算机运算器只有加法没有减法。

加法:
最高位即符号位也参与计算,
且也满足满二进一,若进一相当于溢出,可以忽略。

4+3

在这里插入图片描述
虽然计算机运算器只有加法没有减法,
但是减一个数等于加上这个数的相反数。

4-3=4+(-3)

在这里插入图片描述
问题出现了!
加负数出错。

反码

对于负数,如果我们将除了高位之外的其它位都取反,0变1、1变0再计算会怎么样?
能确定的是负数的原码加反码得0111 1111 = 2^(n-1)-1,
有点像模的概念。

10-3

在这里插入图片描述

10-3(-3取反码)

在这里插入图片描述
已经有点接近了!

补码

取反码后的结果已经很接近了,但是少了一,这是为什么呢?
我们看这个反码区间:
[1111 1111, 0111 1111],
其中1000 0000和0000 0000分别是-0和+0,这,不合适吧。。
那会不会就是多出来1个0导致的?

我们在想,如果留下+0,将-127到-0的二进制都+1,得到[-128, -1],
就是补码,byte取值范围中的-128就是这样来的。

反码、补码对应的数据:
在这里插入图片描述
计算机磁盘存储的就是补码。

负数的原码+补码=2^(n-1),在byte中是128,
原码和补码是同余数,这也是模运算的一种。

10-3(-3取补码)

在这里插入图片描述
这就对了。

总结

反码、补码这些都是针对负数来说的,
正数的原码、反码、补码都是一样的。

八位原码、反码、补码表:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值