为什么要有原码,反码和补码

为什么要使用原码、反码、补码和移码 数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚."(摘自数学发展史>>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 阅读详情

相信大家看到这个标题都不屑一顾,因为在任何一本计算机基础知识书的第一章都有他们的解释,但是在书上我们只能找到一些简单的定义,没次看过之后不久就忘了。最近论坛里有人问起这些概念,看到很多人的回复是以前看过现在忘了去看看某某书之类,很少有给出一个合理的解释。于是本人就开始思考(虽然上帝会发笑,我还是要思考。),于是得出了以下的结论。
数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚.(摘自<<数学发展史>>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题.
数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为
(-127~-0 +0~127)共256个.
  有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits
( 1 ) 10-  ( 1 )10 =  ( 1 )10 + ( -1 )10 =  ( 0 )10
(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确.
  因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码.反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:
 ( 1 )10 -  ( 1 ) 10=  ( 1 ) 10+ ( -1 ) 10=  ( 0 )10
 (00000001) 反+ (11111110)反 =  (11111111)反 =  ( -0 )  有问题.
( 1 )10 -  ( 2)10 =  ( 1 )10 + ( -2 )10 =  ( -1 )10
(00000001) 反+ (11111101)反 =  (11111110)反 =  ( -1 ) 正确
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).
于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:
(-128~0~127)共256个.
注意:(-128)没有相对应的原码和反码, (-128) = (10000000)  补码的加减运算如下:
( 1 ) 10-  ( 1 ) 10=  ( 1 )10 + ( -1 )10 =  ( 0 )10
(00000001)补 + (11111111)补 =  (00000000)补 = ( 0 ) 正确
( 1 ) 10-  ( 2) 10=  ( 1 )10 + ( -2 )10 =  ( -1 )10
(00000001) 补+ (11111110) 补=  (11111111)补 = ( -1 )  正确
   所以补码的设计目的是:
     ⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.
⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计
  所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧! 

为什么要有原码、反码、补码和移码 反码跨 0 计算总是会和预期结果存在 1 的偏差,这个偏差是由于反码多一个 -0 而导致的,解决方法其实很简单,把整个反码向下移一位,也就是消除 -0 这一位, 规定 -1 的补码为 1111 1111,也就是常说的负数的补码是反码加1(所以这个加1并不是无厘头规定非要加1),而正数原码没有任何计算问题,所以正数的补码依然和原码相同。了,这是因为存在 0 和 -0,而 0 和 -0 是一样的,但占据了一位反码的空间,为解决这个问题,引出了补码的概念。(表示分母是2的幂的浮点数可以完美表示) 阅读详情

相关推荐

caxa二次开发实例展示

本人有8年CAXA各产品(如电子图版、工艺图表、PDM等)二次开发经验,参与过国家电网南瑞集团、中石油、龙记集团、欧姆龙集团、港日集团、中集集团、中国五矿、方圆塑机、大连锅炉、金蝶PDM集成CAXA,TEAMCENTER集成CAXA、大连锅炉机械、中国中车等项目的开发,擅长CAXA电子图版、CAXA工艺图表的二次开发,有需要的可以联系我,电话:13169467685、13249738576 Q

hourui800720的专栏 8028

为何要使用原码、反码、补码

初学编程语言的一点小见解之“原码、反码与补码”

2301_76967212的博客 2802

[Ethernet in CANoe]2--如何在CANoe中去仿真CP版本的SOME/IP通信

上篇文章()介绍了SOME/IP的两种类型的数据格式,根据作者目前的项目经验,目前在CANoe V18之前的版本,CP版本的arxml是最方便实现SOME/IP以太网仿真的。作者目前只有CANoe V17的license,所以本片文章是在CANoe 17上基于CP版本的arxml去做仿真模拟。

汽车ECU自动化测试 1764

为什么计算机要使用反码/补码

一、为什么需要反码?反码的作用就相当于数学中的负数。对于小学生来说,会做的算术题是:5-3,但是不会做3-5。于是,我们上初中的时候,数学里就引进了一个新的概念:负数。引入负数之后,本来是减法的运算就可以变成加法来实现:3-5=3+[-5]=[-2],中括号代表“负数”,“负数”就是我们人为给出的数学术语。对于计算机来说,会做的算术题是:5+3,但是不会做3-5。于是,我们就在编码里引进了一个新的概念:反码。引入反码之后,本来是减法的运算就可以变成加法来实现:3-5=3+[-5]=[-2],中括号代表“反码

qq_39812608的博客 3658

利用大规模生物活性挖掘,计算识别针对癌基因驱动蛋白 EGFR、BRAF 与 CDK4 的高亲和力抑制剂

背景:精准癌症治疗需要小分子抑制剂与致瘤蛋白靶点之间的精确匹配。方法:我们使用 Python 及 ChEMBL 数据库 API 开发了一套计算流程,系统性地筛选针对 EGFR、BRAF 与 CDK4 的高亲和力配体。对 IC50 < 1000 nM 的生物活性进行过滤,并检索候选化合物的分子结构(SMILES)以供后续优化。结果:本研究共识别出 [插入总数] 种独特化合物。其中,对 BRAF 激酶而言,我们挑选了一批 IC50 低至 6.0 nM 的高效实验性化合物。

u012133341的博客 96

Open3D KD-tree的使用【2025最新版】

Open3d使用FLANN构建KDTree以便进行快速最近邻检索。博客长期更新,本文最近一次更新时间为:2025年1月1日,代码已同步更新至Open3D 0.18.0版本。

点云侠的博客 40万+

原码、反码、补码,你玩转了吗?

原码、反码、补码的由来;原码、反码和补码间的转换

m0_71273659的博客 966

行为预测模型:Social LSTM与Graph Neural Networks

行为预测模型:Social LSTM与Graph Neural Networks ,人工智能,计算机视觉,大模型,AI,本文围绕行为预测模型Social LSTM与Graph Neural Networks展开,介绍了两者的基础概念、原理、应用场景,还对比了它们在优势、劣势和适用场景上的不同,最后给出了相应的代码示例。Social LSTM基于LSTM,通过社交池化层处理多智能体交互;图神经网络处理图结构数据,靠消息传递获取信息,二者各有侧重,适用于不同场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

为什么要有原码、反码、补码?

负数的原码在计算时总是往相反的方向走,因为有第一位符号位负的存在,加的时候变小,减的时候变大,所以干脆把负数的数据位全部取反,0 变 1、1 变 0,而正数原码计算没有问题,所以正数的反码和原码一样,也就引出了反码的概念。反码跨 0 计算总是会和预期结果存在 1 的偏差,这个偏差是由于反码多一个 -0 而导致的,解决方法其实很简单,把整个反码向下移一位,也就是消除 -0 这一位, 规定 -1 的补码为 1111 1111,也就是常说的。二进制计算的结果 -2 - 1 结果是 -1,而正确结果应该是 -3。

OG one.Z的博客 2202

C#实战:从零搭建Vosk离线语音转文字系统

本文手把手教你用C#构建离线语音转文字系统,基于NAudio和Vosk实现全流程开发。首先介绍环境搭建,包括NuGet包安装和中文模型配置,强调16kHz单声道音频格式的关键性。接着详细解析音频预处理转换、Vosk模型初始化及识别过程的核心代码,提供多线程优化建议和实时识别扩展思路。文章包含80%以上代码注释,从常见问题排查到性能优化技巧,完整覆盖从"Hello World"到工业级部署的关键技术点,特别适合需要开发本地化语音识别应用的C#开发者。

墨夶的博客 752

YOLOv11涨点改进 | Neck改进篇 | YOLOv11引入 BiFPN双向特征金字塔网络,显著提升了多尺度特征融合效率

本文介绍了基于BiFPN特征融合模块优化的YOLOv11目标检测模型。BiFPN通过双向跨尺度连接和加权特征融合机制,显著提升了多尺度特征融合效率。该方法在COCO数据集上实现了55.1AP的检测精度,同时大幅降低计算成本(减少13-42倍FLOPs)。文章详细解析了BiFPN模块结构、核心代码实现方法,并提供了YOLOv11-BiFPN配置文件的修改指导,为计算机视觉领域提供了一种高效的目标检测解决方案。

Ai缝合怪、助力小伙伴高效发论文 714

计算机为什么要分原码、反码、补码,搞的这么复杂?

补码是计算机系统中广泛采用的一种数值表示方式,因为它在解决符号问题的同时,还能够简化二进制加减法运算的硬件电路设计。尽管补码的概念看似复杂,但它极大地提高了计算效率,并保证了系统的可靠性。

AngelCryToo的专栏 927

【图论】系列(七)图论的中心性度量方法及重要性评价指标

图论中的中心性度量方法是用来衡量图中各个节点(或顶点)相对重要性的指标。

qq_30066733的博客 1075

原码、反码和补码介绍及为什么用补码计算

在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.

weixin_39724194的博客 1661

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

原码、反码和补码—— -128的补码为什么是10000000

相信很多人在初学原码、反码、补码的时候总是容易搞蒙。虽然书上写的很清楚,但是每次到要用的时候总是会忘记。当初只好死记硬背下来应付考试,但个中缘由还是难以知晓。 书中关于原码、反码、补码的描述如下: 原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。 机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器...

Lavi的专栏 9000

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

原码、反码和补码以及为什么设计出反码和补码

一、java中为什么byte的取值范围是-128到+127 概念: java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数; 正数补码为其本身; 负数补码为其绝对值各位取反加1; 例如: +21,其二进制表示形式是00010101,则其补码同样为00010101; -21,按照概念其绝对值为00010101,各位取反为11101010...

yun_ld的博客 1669

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

为什么会有原码、反码和补码?

运算革命减法完全融入加法器,硬件复杂度降低50%符号位与数值位统一处理,无需特殊电路数学与硬件的共鸣模运算理论为补码提供数学基础二进制位宽天然契合模系统,实现效率最大化设计哲学启示优秀的技术标准往往源于基础数学原理的创造性应用硬件设计需在数学严谨性与工程可行性间寻求平衡补码的成功印证了计算机科学的核心思想——用简洁的数学原理解决复杂的工程问题。这一设计至今仍在每颗CPU的算术逻辑单元(ALU)中默默运转,见证着数学智慧与工程实践的完美融合。

hughieu的博客 1275

让星星⭐月亮告诉你,原码、反码、补码以及为什么要用反码和补码

转载自: cumtchw When you learn a knowledge, you must reach the level that you can use it profiently, not just know it or be familiar with it https://www.cnblogs.com/cumtchw/p/4523332.html 机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数,机器数是带符号的,在计算机中用一个数的最高位存放符号,正数为0,负数为1,比如,

Dylaniou的博客 849

原码、反码、补码以及为什么要用反码和补码

机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数,机器数是带符号的,在计算机中用一个数的最高位存放符号,正数为0,负数为1,比如,十进制中的+3,假设计算机字长为8位,转换成二进制就是0000 0011,如果是-3,就是1000 0011.那么,这里0000 0011和1000 0011就是机器数, 真值 因为第一位为符号位,所以机器数的形式值就不等于真正的数值,例如上...

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 736

【追根溯源】进制中出现了原码和反码,为什么还会出现补码,补码出现的是为了解决什么问题?而补码的出现是为了解决原码和反码的什么问题?

最高位表示符号(0 为正,1 为负),其余位表示数值的绝对值。

xiaojin511025的博客 670

关于原码、反码和补码,想一想为什么

   相 信大家看到这个标题都不屑一顾,因为在任何一本计算机基础知识书的第一章都有他们的解释,但是在书上我们只能找到一些简单的定义,没次看过之后不久就忘 了。最近论坛里有人问起这些概念,看到很多人的回复是以前看过现在忘了去看看某某书之类,很少有给出一个合理的解释。于是本人就开始思考(虽然上帝会发 笑,我还是要思考。),于是得出了以下的结论。     数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,"正如亚里士多德早就指出的那样,今天十进制的广

做一个优雅的程序员 1000

为什么要使用原码反码和补码和补码溢出问题

原文作者:smile4lee 原文地址:https://blog.youkuaiyun.com/u011080472/article/details/51280919#commentBox 这是从原文中截取的一段,对小错误进行了一些改动,更加深入的分析,请参考作者的原文。 为何要使用原码, 反码和补码 在开始深入学习前, 我的学习建议是先”死记硬背”上面的原码, 反码和补码的表示方式以及计算方法. ...

Noriaki的博客 1216
上一篇: c++ 类的学习(3)
下一篇: 全加器以及行波进位器的延迟时间计算
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值