计算机组成原理第二章数据表示

  • 一、数制与编码
    • 1.1 进位计数制
      • 1.1.1 进制及转换
        • 所谓进位计数法是一种计数方法,咱们最常用的莫过于十进制了,除此之外还有八进制、十六进制等。这里不得不提几个概念术语:
        • 基数:比如说十进制、八进制和十六进制,它们的基数分别为10(0~9)、8(0~7)、16(0~15)
        • 数位:比如二进制数1010,这里就有4个数位,从高位到低位依次的数码值为1、0、1、0
        • 数码:比如八进制,那么数码,即数码值的范围为(0~7)
        • 位权:每个数码所表示的数值等于该数码值乘以一个与它所在位有关的常数,这个常数称为位权。
        • 基数和数码的关系:每个数位所用到的不同数码的个数称为基数
      • 1.1.2 真值、机器数
        • 真值
          • 我们日常见到的,有“+”、“-”号的数为真值,比如:+15,-8。
          • 真值是机器数所代表的实际值,一般为十进制数。
        • 机器数
          • 将“符号->数字化”的数。一般为二进制数,比如带符号位的 4 位二进制数 0110,最高位 0 就是符号位,这个数的真值就是 +6。通常0代表“+”号,1代表-号。
      • 1.1.3 进制转换
        • 进制转换是在不同的进制之间进行转换的过程。例如,我们可以将一个十进制数转换为二进制数,或者将一个十六进制数转换为八进制数。以下是一些常见的转换方法:
        •  十进制转二进制:通过不断地除以2并记录余数,然后将余数反向排列,我们可以得到二进制表示。
        •  二进制转十进制:通过将每个二进制位乘以2的相应次方(从右到左,从0开始计数),然后将结果相加,我们可以得到十进制表示。
        • 十进制转十六进制:通过不断地除以16并记录余数,然后将余数(使用0-9和A-F表示10-15)反向排列,我们可以得到十六进制表示。
        • 十六进制转十进制:通过将每个十六进制位乘以16的相应次方(从右到左,从0开始计数),然后将结果相加,我们可以得到十进制表示。
      • 1.1.4 补码、反码
        • 补码和反码是计算机中用于表示负数的两种方法:
        • 反码:对于一个二进制数,其反码是将该数的每一位都取反(即0变为1,1变为0)。
        • 补码:对于一个二进制数,其补码是将该数的反码加1
      • 1.1.5 浮点数
        • 浮点数是一种用于表示实数的计算机数制,它由符号位、指数部分和尾数部分组成。浮点数可以用来表示非常大或非常小的数,以及精确到小数点后多位的数。
  • 二、定点数的表示和运算
    • 2.1 定点数的表示
      • 2.1.1 无符号
        • 整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。若机器字长为 8 位,则数的表示范围  0~255。(通常只有无符号整数,没有无符号小数)
      • 2.1.2 有符号(原码、反码、补码、移码)
        • 在机器中,数的正负我们无法识别,但是我们可以用二进制数来代替正负号。一般‘0’为正,‘1’为负,符号位一般在有效数的最前面。
        • 原码
          • 用尾数表示真值的绝对值,符号位 “0/1”  对应 “正/负”。
        • 反码
          • 若符号位为 0,则反码原码都相同。若符号位为 1,则数值位全部取反。(反码的取值范围与原码相同)
        • 补码
          • 正数的补码 = 原码;  负数的补码 = 反码末位 + 1(要考虑进位)
          • 补码的作用:让减法操作转变为与之等价的加法操作,节省硬件成本。
        • 移码
          • 在补码的基础上,将符号位取反。移码只能用于表示整数。(移码的取值范围与补码相同)
          • 在进行数值比较时,用移码表示的整数符合计算机比较的特性(从前往后先出现1的大),很容易对比大小
    • 2.2 定点数的运算
      • 2.2.1 移位运算
        • 含义
          • 通过改变各个数码位小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法。
        • 分类
          • 算数移位:
            • 原码的算术移位:
              • 符号位保持不变,仅对数值位进行移位。
                • 右移:
                  • 高位补0,低位舍弃。若舍弃的位 = 0,则相当于 ÷ 2 ;若舍弃的位 ≠ 0,则会丢失精度
                • 左移:
                  • 低位补0,高位舍弃。若舍弃的位 = 0,则相当于 × 2 ;若舍弃的位 ≠ 0,则会出现严重错误
            • 反码的算术移位:

计算机组成原理第二章数据表示_第1张图片

            • 补码的算数移位

计算机组成原理第二章数据表示_第2张图片

          • 逻辑移位:
            • 逻辑右移:高位补 0,低位舍弃
            • 逻辑左移:低位补 0,高位舍弃逻辑以为可以看作对 “无符号数” 的算术移位。
          • 循环移位:
            • 循环右移:最低位被舍弃并复制到最高位。
            •  循环左移:最高位被舍弃并复制到最低位。
            •  循环移位可以看作是逻辑移位的一种变体,其中舍弃的位不是被丢弃,而是被移动到另一端。这在某些算法和硬件设计中非常有用。
      • 2.2.2 加减运算(溢出判断)
        • 原码的加减运算
          • 原码的加减运算需要考虑符号位。对于加法,如果符号相同,那么就按照正常的二进制加法进行计算,然后保留符号;如果符号不同,那么就按照正常的二进制减法进行计算,然后保留绝对值较大数的符号。对于减法,可以将减数的符号取反,然后按照加法的规则进行计算。
        • 补码的加减运算
          •  对于补码来说,无论加法还是减法,最后都会转变成加法,由加法器实现运算,符号位也参与运算。如果两个数符号相同,且结果的符号与原来不同,那么就发生了溢出。
        • 溢出判断
          • 方法①:采用一位符号位
            • 如果使用一位符号位,那么可以通过检查结果的符号位和操作数的符号位是否不同来判断是否发生了溢出。如果符号位不同,那么就发生了溢出。
          • 方法②:采用一符号位,根据数据位进位情况判断溢出
            • 如果使用一位符号位,并且根据数据位的进位情况来判断溢出,那么可以通过检查最后两次进位是否不同来判断是否发生了溢出。如果最后两次进位不同,那么就发生了溢出。
          • 方法③:采用双符号位
            • 如果使用双符号位,那么可以通过比较两个符号位是否不同来判断是否发生了溢出。如果两个符号位不同,那么就发生了溢出。
      • 2.2.3 乘法运算
        • ① 原码的乘法运算
          • 对于原码的乘法运算,首先确定结果的符号,如果两个数的符号相同,那么结果为正,否则结果为负。然后取两个数的绝对值进行乘法运算,得到的结果再加上符号位。
        • ② 补码的乘法运算
          • 对于补码的乘法运算,直接将两个补码相乘,得到的结果就是最终结果的补码。这种方法的优点是不需要考虑符号位,简化了运算过程。
      • 2.2.4 除法运算
        • ① 原码的除法运算
          • 对于原码的除法运算,首先确定结果的符号,如果两个数的符号相同,那么结果为正,否则结果为负。然后取被除数和除数的绝对值进行除法运算,得到的结果再加上符号位。
        • ② 补码的除法运算
          •  对于补码的除法运算,首先将被除数和除数转换为补码,然后进行除法运算,得到的结果就是最终结果的补码。这种方法的优点是不需要考虑符号位,简化了运算过程。
    • 2.3 强制类型转换
      • 强制类型转换是一种编程操作,它将一个数据类型转换为另一个数据类型。
      • 在C语言中,强制类型转换是通过在需要转换的数据类型前面加上要转换成的数据类型来实现的,即使用括号将需要转换的值括起来,然后放在要转换成的数据类型的前面。例如,如果你有一个`double`类型的变量,你可以通过`(int)`来将它转换为`int`类型。
    • 2.4 数据的存储和排列
      • 大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。
      • 小端模式:指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
      • 数据对齐:对于32位计算机,数据以边界对齐方式存储,半字地址一定是2的整数倍,字地址一定是4的整数倍,这样无论所取的数据是字节、半字还是字。均可一次访存取出。这样虽然浪费了一些存储空间,但是却提高了取指令和取数据的速度。
  • 三、浮点数的表示和运算
    • 3.1 浮点数的表示
      •  3.1.1 浮点数的作用和基本原理
        • 浮点数是一种对于实数的近似值数值表现法,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次指数得到。
        • 利用浮点进行运算,称为浮点计算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。
      • 3.1.2 浮点数规格化
        • 规格化是指阶码前面只有一位1的浮点数,其可以更精确地表示一个数值,并且能够更好地进行数值比较¹⁴¹⁵。
    • 3.2 浮点数标准 IEEE 754
      • IEEE 754规定了四种表示浮点数值的方式:单精确度(32位元)、双精确度(64位元)、延伸单精确度(43位元以上,很少使用)与延伸双精确度(79位元以上,通常以80位元实做)。
    • 3.3 浮点数的运算
      • 加减运算
        • 浮点数加减运算包括五个步骤:① 对阶 ② 尾数加减 ③ 规格化 ④ 舍入 ⑤ 判溢出。
      • 强制类型转换
        • 对于将整数类型int转换为浮点型float,我们可以使用强制类型转换的方式实现。例如:`int a = 10; float b = (float)a;` 在这个例子中,将整数类型的变量a转换为浮点类型的变量b

你可能感兴趣的:(ide,oracle)