各种机器码的本质(原码、反码、补码、移码、IEEE754格式阶码)

news2024/11/15 8:32:17

在这里插入图片描述

总述

  • 无论使用什么格式的机器码来表示真值,若取一定位数n以后,各个比特位的排列个数是一定的,为 2 n 2^n 2n种排列,所以选择什么格式的机器码实质上选择什么映射方式来完成从这 2 n 2^n 2n种离散排列到离散的整数真值的映射,而不同的映射方式其实只是在:算数运算能力、逻辑比较能力和可读性三者中进行权衡。
  • 需要解释上图,需要读者先接受一种思考的角度:比特位的排列可以暂时完全看成看成无符号数,其绝对值从左到右递增,而与具体的机器数格式无关

原码

最符合人类直觉的机器码

算数运算能力:差

  • 符号位不能参与运算,需要另外设置电路进行处理
  • +0和-0分别占了一个排列,既不统一又浪费空间

逻辑比较能力:差

  • 需要先区分符号位且在同一符号内部的变化趋势也不同,正数内部随着比特位的绝对值增大而增大,负数内部随着比特位的绝对值增大而减小。这意味着不仅要设置电路区分正负,甚至正数和负数内部的比较逻辑都需要不同的电路

可读性:好

  • 可读性很好,可以很方便看出真值

反码

后面补码的出现,让反码成为了仅仅为了导出补码的工具

算数运算能力:差

  • 符号位不能参与运算,需要另外设置电路进行处理
  • +0和-0分别占了一个排列,既不统一又浪费空间

逻辑比较能力:一般

  • 只需要区分符号位,在同一符号内部的变化趋势相同,都是随着比特位的绝对值增大而增大

可读性:一般

  • 可读性一般,不容易看出真值

补码

补码继承了反码的优点,克服了反码的缺点。已经是一种很优秀的机器码了

算数运算:非常好

  • 符号位可以直接参与运算
  • 0的表示完成了统一,而且可以多表示一个最小值,一举两得

逻辑比较:一般

  • 同反码一样,只需要区分符号位,在同一符号内部的变化趋势相同,都是随着比特位的绝对值增大而增大

可读性:差

  • 基本上无法读了

移码

虽然补码对于机器而言已经近乎完美,但是在某些需要频繁比较而几乎不需要进行加减运算的场合,补码的表现依然可以改进,因为它每次比较都需要先判断符号位然后再比较。如果能想到一个能免去比较符号这一步的机器码就能解决这个问题,而移码恰好完美符合这一点。

算数运算:一般

  • 不如补码方便,尤其是减法运算

逻辑比较:非常好

  • 逻辑比较:只需要按无符号数的视角比较绝对值即可,绝对值越大所表示的数的真值就越大。不需要额外设置任何电路

可读性:很好

  • 可读性:可以根据移码快速读出两数谁大谁小

IEEE 754阶码(本质是经过改造的特殊移码)

IEEE 754的阶码虽然本质上是移码,但是和一般的移码有所不同

  • 先说明,改造了哪些地方:
    • 全0和全1机器码不能再用作普通阶码,要作特殊解释
    • 偏置值小了1
  • 然后说明,为什么要这么改:
    • 全0和全1意义的修改是为了——需要特殊值来表示无穷大∞和非数NAN
    • 偏置值小1是为了——获得更大的正数阶码
  • 结果:在这两点改动之后,阶码可以表示的真值的范围发生的变化是:
    • 最大值无变化,依然为 2 n − 1 − 1 2^{n-1}-1 2n11,最小值从 − 2 n -2^n 2n变成 − 2 n + 2 -2^n+2 2n+2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1061814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open X-Embodiment Robotic Learning Datasets and RT-X Models

文章目录 简介论文链接项目链接Reference 简介 为什么机器人技术远远落后于 NLP、视觉和其他 AI 领域?除其他困难外,数据短缺是罪魁祸首。谷歌 DeepMind 联合其他机构推出了 Open X-Embodiment 数据集,并训练出了能力更强的 RT-X 模型。 Dee…

6-1 选择排序

#include <stdio.h>#define N 1000 int arr[N];/* 对长度为n的数组arr执行选择排序 */ void selectionSort(int arr[], int n);/* 打印长度为n的数组arr */ void printArray(int arr[], int n);void swap(int *xp, int *yp) {int temp *xp;*xp *yp;*yp temp; }int mai…

第八章 排序 二、插入排序

目录 一、算法思想 二、例子 三、代码实现 四、空间复杂度 五、时间复杂度 1、最好的情况 2、最坏的情况 六、优化&#xff08;折半插入排序&#xff09; 七、总结 一、算法思想 每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中&#xff0c;直到所…

STL-stack、queue和priority_queue的模拟实现

目录 一、容器适配器 &#xff08;一&#xff09;什么是适配器 &#xff08;二&#xff09;stack和queue的底层结构 二、Stack 三、queue 四、deque双端队列 &#xff08;一&#xff09;优点 &#xff08;二&#xff09;缺陷 五、优先级队列 &#xff08;一&#xff…

如何在终端输出颜色

效果演示: 【看 welcome to here 部分】 环境&#xff1a; Node.js 18.16.0 正文部分 我们可以通过 console.log() 在终端打印字符串。 只要在我们的字符串前面加上转义字符即可。 差不多就是下面这样的结构&#xff1a; 用代码就是&#xff1a; console.log("\x1B…

学习记忆——宫殿篇——记忆宫殿——地点桩——演讲稿定位记忆

其实在演讲的时候有很多人会遇到这样的情况&#xff0c;演讲内容准备的滚瓜烂熟&#xff0c;但是当自己在台上十分紧张的时候&#xff0c;突然忘记要说的内容。 今天在这里就用记忆宫殿的方法为大家解决这样一个问题。 注意&#xff1a;我们在运用这种记忆方法的前提是你已经对…

python笔记:pandas/geopandas DataFrame逐行遍历

在Pandas和GeoPandas中&#xff0c;可以使用几种不同的方法来遍历DataFrame的每一行 0 数据 import pandas as pddata {column1: range(1, 1001),column2: range(1001, 2001) } df pd.DataFrame(data) df 1 iterrows for index, row in df.iterrows():print(index)print(r…

SRT服务器SLS

目前互联网上的视频直播有两种&#xff0c;一种是基于RTMP协议的直播&#xff0c;这种直播方式上行推流使用RTMP协议&#xff0c;下行播放使用RTMP&#xff0c;HTTPFLV或者HLS&#xff0c;直播延时一般大于3秒&#xff0c;广泛应用秀场、游戏、赛事和事件直播&#xff0c;满足了…

MySQL的复合查询

文章目录 1. 多表查询2. 自连接3. 子查询3.1 单行子查询3.2 多行单列子查询3.3 单行多列子查询3.4 在from子句中使用子查询 4. 合并查询4.1 union all4.2 union 5. 内连接6. 外连接6.1 左外连接6.2 右外连接 1. 多表查询 前面我们讲解的mysql表的查询都是对一张表进行查询&…

[架构之路-230]:计算机硬件与体系结构 - 可靠性、可用性、稳定性;MTTF、MTTR、MTBF

目录 一、软件质量属性 二、可靠性、可用性、稳定性区别 2.1 比较 2.2 公式比较 2.3 "正常工作时间"和"正常运行时间" 2.4 比较案例 2.5 可用性好但可靠性较差的示例 三、MTTF、MTTR、MTBF 3.1 图示 3.2 定义 &#xff08;1&#xff09;MTTF&am…

【uniapp+vue3+ts】请求函数封装,请求和上传文件拦截器

1、uniapp 拦截器 uni.addInterceptor(STRING,OBJECT) 拦截器中包括基础地址、超时时间、添加请求头标识、添加token utils文件夹下新建http.ts 拦截uploadFile文件上传&#xff0c;rquest请求接口 cosnt baseUrl xxxx// 添加拦截器 const httpInterceptor {//拦截前触发i…

Python逐日填补Excel中的日期并用0值填充缺失日期的数据

本文介绍基于Python语言&#xff0c;读取一个不同的列表示不同的日期的.csv格式文件&#xff0c;将其中缺失的日期数值加以填补&#xff1b;并用0值对这些缺失日期对应的数据加以填充的方法。 首先&#xff0c;我们明确一下本文的需求。现在有一个.csv格式文件&#xff0c;其第…

几种开源协议的区别(Apache、MIT、BSD、MPL、GPL、LGPL)

作为一名软件开发人员&#xff0c;你一定也是经常接触到开源软件&#xff0c;但你真的就了解这些开源软件使用的开源许可协议吗&#xff1f; 你不会真的认为&#xff0c;开源就是完全免费吧&#xff1f;那么让我们通过本文来寻找答案。 一、开源许可协议简述 开源许可协议是指开…

CI/CD工具中的CI和CD的含义

CI/CD工具中的CI和CD的含义&#xff1f; CI/CD 是现代软件开发方法中广泛使用的一种方法。其中&#xff0c;CI 代表持续集成&#xff08;Continuous Integration&#xff09;&#xff0c;CD 则有两层含义&#xff0c;一是持续交付&#xff08;Continuous Delivery&#xff09;…

Linux CentOS7 vim寄存器

计算机中通常所说的寄存器Register一般指的是CPU中的寄存器&#xff0c;用来暂存CPU处理所需要的指令、数据等。 vim中同样也有寄存器&#xff0c;使用的方式和CPU非常类似。 vim中的寄存器(register)作用和windows中的剪切板类似&#xff0c;不过vim中的寄存器不止一个&…

前后端协议后端统一返回格式Result

/*** 后端统一返回结果* param <T>*/ Data public class Result<T> implements Serializable {private Integer code; //编码&#xff1a;1成功&#xff0c;0和其它数字为失败private String msg; //错误信息private T data; //数据public static <T> Result…

STM32芯片为什么有那么多组VDD?

对于一般的IC元器件通常只有两个电源引脚&#xff0c;一个是Vcc或Vdd&#xff0c;和GND或Vss。学习过32单片机的小伙伴肯定都会有这个发现&#xff0c;32单片机有多组VDD&#xff0c;单片机的引脚资源那么珍贵&#xff0c;为什么要在这里浪费那么多引脚呢&#xff1f;还有就是引…

十三、Django之添加用户(原始方法实现)

修改urls.py path("user/add/", views.user_add),添加user_add.html {% extends layout.html %} {% block content %}<div class"container"><div class"panel panel-default"><div class"panel-heading"><h3 c…

c语言练习78:执⾏操作后的变量值

字符串函数汇总 1. strlen &#xff1a;计算字符串的⻓度。 2. strcpy &#xff1a;将⼀个字符串复制到另⼀个字符串中。 3. strcat &#xff1a;将⼀个字符串连接到另⼀个字符串的末尾。 4. strcmp &#xff1a;⽐较两个字符串是否相等。 5. strncmp &#xff1a;⽐较两个…

Electron.js入门-构建第一个聊天应用程序

什么是electron 电子是一个开源框架&#xff0c;用于使用web技术构建跨平台桌面应用程序&#xff1b;即&#xff1a; HTML、CSS和JavaScript&#xff1b;被集成为节点模块&#xff0c;我们可以为我们的应用程序使用节点的所有功能&#xff1b;组件&#xff0c;如数据库、Api休…