C++学习笔记(基础002--信息的存储方式)

本文为个人学习笔记,参考自:《C++程序设计(第4版)》

0.02 信息的存储方式

    一、信息

    计算机加工的对象是数据信息,而指挥计算机操作的是控制信息,因此计算机内部的信息可以分为两大类。

    • 控制信息(指令、控制字)
    • 数据信息(数字信息<定点数、浮点数>、非数值信息<字符数据、逻辑数据>)

    人们最熟悉十进制数系,但是几乎所有的计算机采用的都是二进制数系。
    所有的外界信息在被转化为不同的二进制数后,计算机才能对其进行传送、存储和加工处理。

    二、采用二进制码表示信息优点

    1/ 易于物理实现

    具有两种稳定状态的物理器件很多,如门电路的导通与截止,电压高低,恰好对应1与0

    2/ 二进制数运算简单

    对R进制的算数求和、求积规则各有R(R+1)/2种

    3/ 机器可靠性高
    电压高低、电流的有无都是质的变化,两种状态分明。基2码的传递抗干扰能力强,鉴别信息可靠性高

    4/ 通用性强
    基2码成功地运用于数值信息编码(二进制),还适用于各种非数值信息的数字化编码。
    特别是仅有的两个符号0和1正好与逻辑命题的两个值真与假相对应,从而为计算机实现逻辑运算和逻辑判断提供了方便。

    当进行程序设计时,与二进制进行转换比较方便的八进制、16进制系表示法也经常使用。
    无论哪种数系,其共同之处都是进制记数制。

    三、几种进制之间转换

    • R进制->十进制

      基数为R的数字,只要将各位数字与它的权相乘,其积相加,和数就是十进制数。
      如:

      C++学习笔记(基础002--信息的存储方式)

    • 十进制->R进制

      可将整数和小数分别转换在拼接。

      • 整数:(除R取余法)用10进制数连续除以R,它的余数即为相应R进制数的各位系数

        C++学习笔记(基础002--信息的存储方式)

      • 小数:(乘R取整)连续乘以R,得到的整数即组成R进制的数。

        C++学习笔记(基础002--信息的存储方式)

        C++学习笔记(基础002--信息的存储方式)

    • 二、八、十六进制的相互转换

      C++学习笔记(基础002--信息的存储方式)

    四、信息的存储单元

    计算机内部,各种信息都是以二进制编码形式存储。
    信息的单位通常采用 位、字节、字。

    • 位(bit):量度数据的最小单位,表示1位二进制信息
    • 字节(Byte):信息存储中最常用的基本单位(1字节=8位)

      1Byte = 8bit 1K = 1024B
      1M = 1024K 1G = 1024M

    • 字(Word):字是位的组合,并作为一个独立的信息单位处理。字又称为计算机字,它的含义取决于机器的类型、字节、使用者要求。常见的固定字长有8位、16位、32位等。

    信息单位用来描述机器内部数据格式,即数据(包括指令)在机器内的排列形式,如:单字节数据、可变长数据(以字节为单位组成几种不同长度的数据格式)等。

    • 机器字节:在讨论信息单位时,还有一个与机器硬件指标有关的单位,这就是机器字长。 机器字长一般指参加运算的寄存器所含有的二进制数的位数,它代表了机器的精度,如32位、64位等。

    五、二进制数的编码表示

    一个数在机内的表达形式称为”机器数“,而它代表的数值称为此机器数的”真值”

    计算机内,用0表示正号,1表示负号,符号位放在数的最高位。

    C++学习笔记(基础002--信息的存储方式)

    数值信息在计算机内采用符号数字化处理后,计算机便可以识别和表示数符了。

    为了改进符号数的运算方法和简化运算器的硬件结构,人们研究了符号数的多种二进制编码方法,其实质是对负数表示的不同编码

    常用的编码:

    • 原码

      符号位数字化为0或1,数的绝对值与符号一起编码,即所谓“符号-绝对值表示”的编码,称为原码

      如果用一个直接存放一个整数,原码表示如下:
      C++学习笔记(基础002--信息的存储方式)

    • 反码

      正数的反码与原码相同。

      负数的反码与原码如下关系:

      负数反码的符号位与原码相同(仍用1表示),其余各位取反(0变1,1变0).

      C++学习笔记(基础002--信息的存储方式)

    • 补码

      • 模数

        模数从物理意义上讲,是某种计量器的容量。
        在模式系统中,8-2=(8+10)mod 12
        之所以上式成立,是因为2与10对模数12是互为补数的(2+10=12).因此可以认为:在模数系统中,一个数减去另一个数,或者说加上一个负数,等于第一个数加上第二个数的补数。

        上面的,我们称10为-2在模12下的“补码”。负数采用补码表示后,可以使加减法统一为加法运算。

        计算机中,机器表示数据的字长是固定的。对于n位数来说,模数的大小是:n位数全为1,且最末位再加1.实际上模数的值已经超过了机器所能表示的数的范围,因此模数在机器中是表示不出来的。若运算数大于模数,这模数自动丢掉,也就等于实现了取模运算。

        如果有n位整数(包括一位符号位),则它的模数为2的n次幂;如果有n位小数,小数点前一位为符号位,则它的模数为2。

      • 补码表示法

        由上,对于一个二进制负数,可用其模数与真值做加法(模减去该数的绝对值)求得其补码。

        C++学习笔记(基础002--信息的存储方式)

        由于机器中不存在数的真值形式,用上述公式求补码在机器中不易实现,但是上式可以导出一个简便方法:

        C++学习笔记(基础002--信息的存储方式)

      • 补码运算规则

        采用补码表示的另一个好处就是当数值信息参与算数运算时,采用补码方式是最方便的

        首先,符号位可作为数值参与运算,最后仍可得到正确的结果符号,符号无须单独处理;其次,采用补码进行运算时,减法运算可转换为加法运算,简化了硬件中的运算电路。
        C++学习笔记(基础002--信息的存储方式)

        由于字长只有8位,因此加法最高位的进位自然丢失,达到了取模效果(即丢掉一个模数)

        注意:补码运算的结果仍为补码
        上例中结果为正,所以补码即为原码,转为10进制为57.

        若结果为负,则是负数的补码形式,若要变成原码,需要对补码再求补,即可还原为原码

        C++学习笔记(基础002--信息的存储方式)

        C++学习笔记(基础002--信息的存储方式)


    六、定点数和浮点数

    C++学习笔记(基础002--信息的存储方式)

    七、数的表示范围

    C++学习笔记(基础002--信息的存储方式)

    C++学习笔记(基础002--信息的存储方式)

    八、非数值信息的表示

    C++学习笔记(基础002--信息的存储方式)