定点数的表示和运算
包含原码补码反码和二进制数的运算假如你考408原码补码移位和加减比较重要无符号数定义整个机器字长的全部二进制位均为数值位没有符号位相当于数的绝对值(没有正负)位二进制可以表示种状态/数值有符号数定义有一位为符号其余全为数值位0为正号1为负号小数表示范围~整数表示范围~原码就是符号位数值直接拼接即为原码纯小数原码当为正数时当x为负数时本质上就是0正1负若字长8位标准的原码就为形如0.1101000/1.1101000其中开头的0和1表示符号当然计算机保存的是01101000/11101000纯整数原码将符号位加到数值前如0000111010001110其中开头的0/1表示正负补码补码适用于有符号二进制数的运算正数与原码相同负数符号数与原码相同数值位由原码取反加1得到111 - 101若要则连同符号位一起取反加一字长的情况下纯小数补码的范围是纯整数补码的范围是反码相较原码和补码反码使用较少无需特别关注对于正数反码和原码相同对于负数原码符号位不变数值部分按位取反表示范围与原码一样移码将真值加上一个偏置值让移码可以像数轴一样自中心开始表示数据即从0000 0000 ~ 1111 1111分别对应移码的-128 ~ 127移位运算顾名思义就是对小数点/数据进行移位正常来说对于k进制左移一位相当于将原数乘上k右移一位相当于除以k逻辑移位逻辑移位是对于无符号数来进行的对于十进制100.0我们向左移一位变为10.00向右移一位变为1000对于二进制或者机器数时无符号我们进行逻辑位移逻辑左移时高位移丢低位添0逻辑右移时低位移丢高位添0。例如对101101010逻辑右移一位变为010110101逻辑左移一位变为011010100算数移位算数移位是对于有符号数来进行的符号位不参与移位原码算数移位左移丢移运算出错右移丢一影响精度。所以对于原码来说如果移位时1在边界位置应当保留不然会导致运算错误反码移位正数时与原码一样负数时左移添0右移添1循环移位将多出来的位数添加到尾部10110101 - 01101011左移一位下面是四种情况加减运算由于补码可以直接进行有符号数的运算所以我们可以直接将变为如果原来是我们也要尽量转变为加法运算来进行就是对整体进行取反加一包括符号位溢出判断由于在进行加减运算时数据可能存在进位导致数据溢出比如只能表示8位但结果有九位导致计算的结果不正确所以我们要对结果进行溢出判断溢出分为上溢正溢出和下溢负溢出判断方法一进行符号位判断比如两个正数相加符号位一定为0但如果存在溢出可能导致进位使符号位变为1此时我们知道数据溢出了单符号位判断其实和上面的符号判断差不多就是更加接近硬件判断方法而已Cn-1最高数值位相加时有没有向符号位进位1表示有Cn符号位相加时有没有向更高位进位1表示有然后进行异或运算 Cn−1​⊕Cn​ 如果结果为1则溢出为0则不溢出Cn1符号位向更高位进位了↓1 | 0 1 1 (-5) 1 | 0 1 1 (-5)----------------0 | 1 1 0 (6)↑Cn-10最高数值位没向符号位进位双符号位判断从原来的一位符号位表示正负变成了两位符号位表示正负单符号只可以判断有没有溢出但双符号可以判断溢出方向是正溢出还是负溢出不同双符号位表示含义双符号位 含义00 正数11 负数01 正溢出上溢10 负溢出下溢比如00 101 00 100 得到 01 001就是正溢出比如11 1011 11 1011 得到10 110就是负溢出高位被丢弃了乘法运算原码乘法原码乘法和正常的乘法没什么区别符号位将两位符号位异或⊕运算得出数据位和普通的乘法原理相同补码乘法补码乘法采用Booth算法思路来源0111 1000 - 0001011111 100000 - 000001可以看出连续 n 个1 高位的1 - 低位的1那么 01110 10000 - 00010因为1012​×210102​ 末尾加个0左移1位 101012​×4101002​ 末尾加两个0左移2位 20所以 01110 * 被乘数 10000 - 00010* 被乘数 被乘数左移四位 - 被除数左移一位就变成了一次加法和一次减法... 0 1 1 1 0 ...↑ ↑开始 结束开始0→1要开始做加法了结束1→0这串1结束了要减掉所以当读到01的时候就是要加读到10的时候就是要减如果是00或者11就不动继续读下去我们在硬件实现中不会用左移因为这样非常麻烦统一用累加器右移如何替代左移左移 被乘数 * 2右移 累加器 / 2如果先加后右移新累加器 旧累加器 被乘数/ 2 旧累加器 / 2 被乘数我们发现累加器中的数相对于被乘数是左移的所以这是一个相对的问题回到Booth算法中如果我们要计算5 * -3我们就要进行如下操作1.准备工作被乘数 5的补码为 00 0101乘数 -3的补码为 1 1101-被乘数 -5的补码为 11 1011A累加器00 00006位 双符号位C乘数11101辅助位0第一轮C的最低位 1 0组合为10所以要进行减法操作A A -被乘数 00 0000 11 1011 11 1011整体右移移位前A 1 1 1 0 1 1C 1 1 1 0 1 0联合看成111011 11101 0算术右移符号位是1高位补11 1 1 1 0 1 1 1 1 1 0 1↑ ↑ ↑A C Y_{-1}结果A11 1101C1 11101第二轮C最低位0 1组合为01进行加法操作A A 被乘数 00 0010整体右移移位前A 0 0 0 0 1 0C 1 1 1 1 0移位前A 0 0 0 0 1 0C 1 1 1 1 0Y_{-1} 1联合0 0 0 0 1 0 1 1 1 1 0 1算术右移符号位是0高位补00 0 0 0 0 1 0 1 1 1 1 0↑ ↑ ↑A C Y_{-1} 1联合0 0 0 0 1 0 1 1 1 1 0 1算术右移符号位是0高位补00 0 0 0 0 1 0 1 1 1 1 0↑ ↑ ↑A C Y_{-1}A 00 0001 C0 1111 0后面的操作与上面类似除法手动的除法大家都知道和普通的除法区别不大在计算机内我们采用恢复余数法来进行计算原码恢复余数法符号位单独处理数值位计算得出核心思想以7 / 3为例恢复余数的计算方法为7 - 3 44 - 3 11 - 3 -2 0因为小于0了于是加回来恢复余数为正数于是得到7 / 3 2 .......1算法流程图如下开始│▼┌─────────────┐│ 余数 被除数 ││ 商 0 │└─────────────┘│▼循环 n 次n 数值位数│├──→ 余数左移 1 位│├──→ 余数 余数 - 除数│├──→ 余数 ≥ 0 ?│ ││ 是 → 商最低位 1│ ││ 否 → 商最低位 0│ 余数 余数 除数恢复│└──→ 商左移 1 位为下一位腾出位置│▼结束原码不恢复余数法加减交替法不恢复余数和恢复余数只在最后将除数加回来这一步存在差异假设第轮发现减完是负数那么就会出现如下操作余数左移一位变为减除数变为于是恢复后左移变为同时下一轮还要减下轮要计算不恢复余数的想法商为0下轮本来就要左移不如直接带着负数余数左移加除数然后我们发现下轮计算的东西一样但是我们省去了恢复的步骤不恢复余数的规则| 上轮余数情况 | 上轮商 | 本轮操作 || 正够减 | 1 | 左移减除数 || 负不够 | 0 | 左移加除数 |商添加在右方如0000- 0001- 0010补码加减交替法在补码中符号位参与运算运算规则X为被除数Y为除数A为余数| 步骤 | 判断条件 | 操作 | 上商 || 第一步 | [X]_补 与 [Y]_补 同号 | A A - Y即 A [-Y]_补 | 1 || 第一步 | [X]_补 与 [Y]_补 异号 | A A Y | 0 || 后续步 | [R]_补 与 [Y]_补 同号 | 左移后 A A - Y | 1 || 后续步 | [R]_补与 $[Y]_补 异号 | 左移后 A A Y | 0 || 末位 | 恒置1简化硬件 | — | 1 |强制类型转换无符号数和有符号数之间转换不改变数据类型只改变解释方式short x -4321; x (unsigned short)x;x原来为1110 1111 0001 1111转类型后依然是这样只是将符号位也读为数据位了而已长类型转短类型高位截断丢弃低位保留如1110 1111 0001 1111假设只保留8位变为0001 1111短类型转长类型在前面扩展补0或者1假设0001 1111转为8位变为0000 0000 0001 1111如果为补码负数在前面添1短类型转长类型不会改变数据的数值

相关新闻

期末冲刺倒计时!用AI语音转文字抢救3年课堂录音,72小时重建知识图谱的硬核操作手册

期末冲刺倒计时!用AI语音转文字抢救3年课堂录音,72小时重建知识图谱的硬核操作手册

更多请点击: https://codechina.net 第一章:期末冲刺倒计时!用AI语音转文字抢救3年课堂录音,72小时重建知识图谱的硬核操作手册 面对堆积如山的MP3、M4A格式课堂录音(总计127小时),传统听写效…

2026/7/19 14:43:04阅读更多 →
AI提示词构建思维导图全流程拆解(从混沌输入到可视化输出的7层逻辑链)

AI提示词构建思维导图全流程拆解(从混沌输入到可视化输出的7层逻辑链)

更多请点击: https://intelliparadigm.com 第一章:AI提示词构建思维导图的底层认知范式 提示词工程并非语法拼凑,而是人类认知结构与大语言模型语义空间对齐的映射过程。其底层范式根植于三个不可分割的认知维度:意图显性化、上下…

2026/7/19 14:43:04阅读更多 →
Lyric-Getter支持的30个音乐播放器列表:QQ音乐、网易云等全覆盖

Lyric-Getter支持的30个音乐播放器列表:QQ音乐、网易云等全覆盖

Lyric-Getter支持的30个音乐播放器列表:QQ音乐、网易云等全覆盖 【免费下载链接】Lyric-Getter Lyric Getter | 酒域-歌词获取 项目地址: https://gitcode.com/gh_mirrors/ly/Lyric-Getter Lyric-Getter是一款功能强大的Android歌词获取工具,通过…

2026/7/19 14:41:03阅读更多 →
Service 业务实现层 ChatServiceImpl

Service 业务实现层 ChatServiceImpl

核心业务处理,包含会话防并发创建、消息事务入库、WebSocket推送、离线消息补发、批量已读标记。 package com.para.system.chat.service.impl; import com.para.common.utils.SecurityUtils; import com.para.system.chat.domain.ChatMessage; import com.para.sys…

2026/7/19 22:38:52阅读更多 →
GetQzonehistory:如何快速找回QQ空间全部历史说说的终极完整指南

GetQzonehistory:如何快速找回QQ空间全部历史说说的终极完整指南

GetQzonehistory:如何快速找回QQ空间全部历史说说的终极完整指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾试图找回QQ空间中那些被时间淹没的青春记忆&#x…

2026/7/19 22:38:52阅读更多 →
抖音自动化视频发布工具:告别重复劳动,专注内容创作

抖音自动化视频发布工具:告别重复劳动,专注内容创作

抖音自动化视频发布工具:告别重复劳动,专注内容创作 【免费下载链接】douyin_uplod 抖音自动上传发布视频 项目地址: https://gitcode.com/gh_mirrors/do/douyin_uplod 在当今短视频内容爆发的时代,抖音创作者面临着前所未有的挑战&am…

2026/7/19 22:38:52阅读更多 →
OpenBoardView:让PCB文件分析变得像翻书一样简单

OpenBoardView:让PCB文件分析变得像翻书一样简单

OpenBoardView:让PCB文件分析变得像翻书一样简单 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView 你是否曾经面对复杂的电路板设计文件感到无从下手?那些密密麻麻的元件、错综复杂的…

2026/7/19 22:38:52阅读更多 →
node-todo API开发实战:构建RESTful接口的最佳实践

node-todo API开发实战:构建RESTful接口的最佳实践

node-todo API开发实战:构建RESTful接口的最佳实践 【免费下载链接】node-todo A simple Node/MongoDB/Angular todo app 项目地址: https://gitcode.com/gh_mirrors/no/node-todo node-todo是一个基于Node.js、MongoDB和Angular构建的简单待办事项应用&…

2026/7/19 22:36:52阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →