• 原码、反码、补码,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,
    
    • 1

    这就是为什么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取补码)

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

    总结

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

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

  • 相关阅读:
    为什么ASO很重要?
    5G面试题目和答案,计算机面试
    一文搞懂Maven配置,从此不再糊涂下载依赖(文末有成品)
    Idea 下载不了源码 cannot download source
    H3C VXLAN配置
    Nginx 监控模块
    GateWay实现负载均衡
    多线程 - 阻塞式队列
    使用hping3和wrk模拟泛洪
    uniapp vue国际化 i18n
  • 原文地址:https://blog.csdn.net/qq_35549286/article/details/126269765