• 1.3 - 码制


    一、机器数

    1、计算机采用的数值的表达方式就是机器数;

    (1)理解
    • 在生活中我们是按十进制计数的,例如10;但是在计算机中是用二进制,这个用于表示十进制数10的二进制的0、1序列,就是机器数。

    2、计算机对机器数的约定

    • 计算机中约定固定长度的二进制位来表示一个数;
    可能是8位,可能是32位,也可能是其他;这个与不同的环境有关,考试的时候需要注意;
    • 机器数中约定,用最高为来表示一个数的正负;
    0表示正数(+);1表示负数(-);
    • 计算机中约定,小数点的位置是固定的;所以机器数中,不需要一位专门的二进制位来表示这个数是小数;
    如果是整数,小数点位在最低有效数位之后;
    如果是小数的话,小数点在符号位之后,最高有效数位之前;

    3、举例说明

    (1)8个二进制位表示一个固定的数,那么最高位用来表示正负,剩余7位用来表示数值;
    • 1对应的机器数是:0(符号位)0000001;
    • -1对应的机器数是:1(符号位)0000001;
    • 整数时的小数点位置:0(符号位)0000000.0;
    • 小数时的小数点位置:0(符号位).0000000;

    二、码制

    1、原码

    (1)定义
    • 原码(true form)是计算机中一种对数字的二进制定点表示方法。
    • 可理解为直接由十进制数转换得到的二进制数,就是原码;
    (2)运算
    • 由图可知,使用原码来进行二进制数的加减法运算,所得到的结果是错误的;原因是,计算时对原码中的符号位也进行了运算;
    (3)正确运算过程
    • 将原码中的符号位剔除出来;
    • 然后确认减数和被减数的大小,依此来判断计算结果是整数还是负数;
    • 然后再进行运算。

    2、反码

    (1)反码的出现原因
    • 按照原码的逻辑进行运算,就复杂了,不利于计算机的实现,所以对于机器数的运算又想出了其他编码方式-反码。
    (2)原码和反码的转换
    • 正数的原码转反码:不变;
    • 负数的原码转反码: 符号位不变;数值位按位取反;
    按位取反就是原来是0的位变成1,原来是1的地方变成0;
    (3)运算
    • 由图可知,使用反码来进行二进制数的加减法运算,所得到的结果是错误的;原因也是,计算时对原码中的符号位也进行了运算;

    3、补码

    (1)补码的出现原因
    • 按照反码的逻辑进行运算,就复杂了,不利于计算机的实现,所以对于机器数的运算又想出了其他编码方式-补码。
    (2)原码和补码的转换
    • 正数的原码转补码:不变;
    • 负数的原码转补码: 符号位不变;数值位按位取反后+1;
    按位取反就是原来是0的位变成1,原来是1的地方变成0;
    (3)反码和补码的转换
    • 整数的补码=反码;
    • 负数的补码= 反码+1;
    (4)运算
    • 由图可知,使用补码来进行二进制数的加减法运算,所得到的结果是正确的;
    (5)补码的引用场景
    • 用于二进制的加减运算;

    4、移码

    (1)移码的出现原因
    • 通过补码表示浮点数时,可能会出现问题;例如 当n无限趋于0的时候, 就等于 ,就是不正确的;所以用移码来表示浮点数;
    (2)补码和移码的转换
    • 正数的移码=补码的符号位取反,其他位不变;
    • 负数的移码=补码的符号位取反,其他位不变;
    (3)移码的引用场景
    • 移码常用于表示浮点数中的阶码。而浮点数的阶码主要决定了浮点数能表示的数值范围。

    三、数表示的范围

    1、原码

    • n位二进制对应的表示编码的个数的计算公式:
    • n-1:最高位是符号位,只表示数值的正负,不表示数值的大小;表示数值位的二进制位数少了一位,所以需要减去1;
    • :n位二进制数值,表示的编码个数;
    • :编码时从0开始编,0~3是四个编码; 是四个编码,分别是00、01、10、11,其中最大值是3;所以 需要再减去1才是最大编码值;所以2n-1-1才能得到最大编码值,才能得到数表示的最大范围;
    • 又因为原码的最高位是符号位,说明原码可正可负,所以原码表示的范围有负区间;

    2、反码

    • 与原码表示的范围一致;

    3、补码

    • 补码表示的范围的正区间,与原码和反码一致;
    • 补码的负区间没有减一,原因是
    (1)已知0有两种表示方式:+0=0 0000000;-0=1 00000000;
    (2)我们把-0(10000000)用来表示极端的情况,也就是负数的最小的端值,所以负数这一区间内就多出来一个,所以就不用减一了;

    4、移码

    • 与补码表示的范围一致;

    四、考法:数的表示范围

    五、各种码制的特点、应用场景

  • 相关阅读:
    fastjson与lombok一起用出现序列化问题
    docker 容器数据在盘与盘之间迁移
    使用Python 获取天气数据
    IDEA 2022 创建 Maven Web 项目教程
    超详细Docker部署SpringBoot+Vue项目(三更博客项目部署)
    NoSQL之 Redis配置与优化
    MySqL速成教程笔记系列七
    【HDFS】客户端写数据时,dataQueue的几处wait方法的调用场景
    DataX二次开发——(6)kafkareader、kafkawriter的开发
    2.KDTree相关
  • 原文地址:https://blog.csdn.net/qq_46071165/article/details/125434671