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

2023-12-18 03:45

本文主要是介绍计算机组成原理第二章数据表示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 一、数制与编码
    • 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,则会出现严重错误
            • 反码的算术移位:

            • 补码的算数移位

          • 逻辑移位:
            • 逻辑右移:高位补 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

这篇关于计算机组成原理第二章数据表示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/506932

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja