• 二进制加减法计算


    1.十进制下的计算

    1.模数

    假设下文【模】定义如下:某个可度量系统的度量范围
    实际【模】在度量系统中无法表示,该值是系统溢出值,遇【模】则表示要进位了,系统可度量值为【模】的余数
    如:
    时:12 ------ 0,1,2,3…11
    分:60 ------ 0,1,2,3…59
    秒:60 ------ 0,1,2,3…59

    2.补数

    一个可确定范围的度量系统,取模为 12,为方便演示我们将其环形排列:
    在这里插入图片描述
    综上:当度量系统模为 12 时,4 和 8 互为补数,即 4 + 8 = 12
    结论:在有模的度量系统中,减某个值等价于加上其补数(可能进位丢失),即将减法转为加法处理 此也为计算机处理二进制减法的做法

    2.二进制数的存储

    1.计算机计数

    计算机用二进制表示数值,且规定内存的最高位作为符号位,用0表示正数,用1表示负数
    
    如一个32位计算机,可以理解成 模 = 2^32 的度量系统,计数值超出 2^32 后则会溢出导致计算异常
    
    又如Java中的Integer类型,长度为 4 字节,即 32 比特,除去最高位为符号位,其实际范围为:-2^31 ~ 2^31 - 1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.原码

    取整数绝对值转换为二进制:

    ±6 原码:00000000 00000000 00000000 00000110
    
    • 1

    3.反码

    正整数反码为其本身(原码)
    负整数反码为其原码按位取反:

    Integer -6
    -6 反码:11111111 11111111 11111111 11111001
    
    • 1
    • 2

    补充:我们说计算机存储最高位为符号位,0 表示正,1表示负;那么以下结论是否正确

    00000000 00000000 00000000 00000110 表示 +6
    10000000 00000000 00000000 00000110 表示 -6 ?
    
    • 1
    • 2

    验证:

    public static void main(String[] args) {
       //+6
       System.out.println(0b00000000000000000000000000000110);
       //-6
       System.out.println(0b10000000000000000000000000000110);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果:看来 -6 在计算机里不是如上表示的(先存疑)

    在这里插入图片描述

    4.补码

    正整数补码为其本身(原码)
    负整数补码为反码 + 1:

    Integer -6
    -6 补码:11111111 11111111 11111111 11111010
    
    • 1
    • 2

    验证:

    public static void main(String[] args) {
        System.out.println(Integer.toBinaryString(-6));
    }
    
    • 1
    • 2
    • 3

    结果:由此可见负数在计算机上是以其反码形式存储

    在这里插入图片描述

    3.二进制计算

    1.中位对称

    在这里插入图片描述

    2.循环进位

    上述系统均为正整数,如果存在负数呢?
    0 ~ 15 共 16 个正整数,对称的情况下引入 16 个负整数,即:-16 到 -1
    此时,系统内最小的数为:-16,则在进位的情况下,15 下一个数应为 -16
    用二进制表示为:1111 + 1 = 10000 ,如果不存在负数,进一位相当于从头循环,即 0 -> 1 -> 2 -> … -> 15 正好 16 个数,此时如果我们用高位表示符号,则 0 为正,1 为负,分别表示 0 到 15 和 -16 到 -1
    在这里插入图片描述
    环形表示如下:
    在这里插入图片描述
    计算 6 - 8 => 6 + (32 - 8) => 24在圆环的位置是:-8
    则 6 - 8 = 0 0110 + 1 1000 = 1 1110 => -2

    3.二进制减法推算

    假设一个 4 位的计算机(无符号),其度量范围即:2^4 =16
    我们知道减去一个数等于加上它的补数:8 - 6 = 8 + (16 - 6)
    二进制表示如下:1000 + ((1 + 1111) - 0110)
    => 1000 + (1 + (1111 - 0110))
    取反得到 6 的反码,+ 1 即 补码
    => 1000 + (1 + 1001) => 1000 + 1010 => 1 0010
    高位溢出,剩余 0010 正好是 8 - 6 = 2

    4.结论

    综上:负数在计算机内是直接以其补码形式存储的,做减法时直接用:
    被减数的源码 + 减数的补码 = 结果

  • 相关阅读:
    【总结】ui自动化selenium知识点总结
    Linux驱动【day2】
    java对一个对象加锁,锁的是什么东西?
    12. Springboot集成Dubbo3(三)Dubbo-Admin
    MappedByteBuffer VS FileChannel:从内核层面对比两者的性能差异
    仅从个人的角度,聊聊年底的程序员招聘与入职情况
    可扩展性对物联网管理系统有哪些影响?
    如何绕过api的防重放做安全测试
    Spring学习笔记5 GoF之工厂模式
    二阶段目标检测介绍
  • 原文地址:https://blog.csdn.net/weixin_42176639/article/details/126881718