二进制原码、反码、补码

二进制“原码、反码、补码”详解 二进制之“原码反码补码” 阅读详情

基础概念和计算方法

在探求为何机器要使用补码之前, 让我们先了解原码,,反码和补码的概念.对于一个数,,计算机要使用一定的编码方式进行存储。 原码、反码和补码是机器存储一个具体数字的编码方式。

模的概念

把一个计量单位称之为模或模数
补码的模为10000 0000
反码的模为1000 0000(从反码的定义也能够知道,即反码的运算不涉及符号位)
模的解释:在日常生活中,有许多化减为加的例子。例如,时钟是逢12进位,12点也可看作0点。
当将时针从10点调整到5点时有以下两种方法:
  • 时针逆时针方向拨5格,相当于做减法:10-5=5
  • 时针顺时针方向拨7格,相当于做加法:10+(12-5)=12+5=5    (模为 12)
同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为28=256。在计算中,两个互补的数称为“补码”。

原码

原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值.。比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位。 因为第一位是符号位,,所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111] 即 [-127 , 127]
原码是人脑最容易理解和计算的表示方式

反码

反码的表示方法是:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值。 通常要将其转换成原码再计算

补码

补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,,其余各位取反, 最后+1.。(即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的, 通常也需要转换成原码在计算其数值。

其他概念

由于计算机中符号和数字一样,都必须用二进制数串来表示,因此,正负号也必须用0、1来表示。用最高位0表示正、1表示负, 这种正负号数字化的机内表示形式就称为“机器数”,
而相应的机器外部用正负号表示的数称为“真值”,将一个真值表示成二进制字串的机器数的过程就称为编码。

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

现在我们知道了计算机可以有三种编码方式表示一个数.。对于正数因为三种编码方式的结果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
所以不需要过多解释。 但是对于负数:
[-1] = [10000001]原 = [11111110]反 = [11111111]补
可见原码、反码和补码是完全不同的。 既然原码才是被人脑直接识别并用于计算表示方式,为何还会有反码和补码呢?
首先, 因为人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值区域的加减。(真值的概念在本文最开头).。但是对于计算机,加减乘数已经是最基础的运算,要设计的尽量简单。计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法。我们知道,根据运算法则减去一个正数等于加上一个负数,即:1-1 = 1 + (-1) = 0,所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。
于是人们开始探索 将符号位参与运算,并且只保留加法的方法。首先来看原码:
计算十进制的表达式:1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
如果用原码表示, 让符号位也参与计算,显然对于减法来说,结果是不正确的。这也就是为何计算机内部不使用原码表示一个数。
为了解决原码做减法的问题,,出现了反码:
计算十进制的表达式:1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
发现用反码计算减法,结果的真值部分是正确的,而唯一的问题其实就出现在"0"这个特殊的数值上。虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。
于是补码的出现,解决了0的符号以及两个编码的问题:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
-1-127的结果应该是-128,在用补码运算的结果中,[1000 0000]补 就是-128。但是注意因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示。(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原,,这是不正确的)
使用补码,不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低。这就是为什么8位二进制,使用原码或反码表示的范围为[-127, +127],而使用补码表示的范围为[-128, 127]。
因为机器使用补码,所以对于编程中常用到的32位int类型,可以表示范围是:[-2^31, 2^31-1] 因为第一位表示的是符号位。而使用补码表示时又可以多保存一个最小值。而且实际上并不是从10000001到11111111依次表示-1到-127,而是刚好相反的,从10000001到11111111依次表示-127到-1
用补码表示负数时:负数X用2^n - |X|来表示,其中n为机器的字长,当n=8时,[-1]补 = 2^8 - 1 = 11111111, [-127]补 = 2^8 - 127 = 100000001

[-0]补=2^8=00000000在补码表示法中只有一种表示,即00000000

转自:http://blog.youkuaiyun.com/yinyhy/article/details/8732118

二进制的原码、反码和补码。 众所周知,电脑使用二进制来储存数据。为了能存储负数,电脑会将最高的二进制位设为符号位,当符号位为0时,该数为非负整数,当符号位为1时,该数为负数。所以像int和long long这种整型变量就能存储负数,而无符号类型变量等,由于没有符号位,不能存储负数,但能存储的值比有符号类型变量的更大。虽然能存储负数了,但使用这种存储方式将负数与其他数进行运算时,会很麻烦。为了让负数方便地与其他数进行运算,补码就诞生了。 阅读详情

相关推荐

LoRA学习: SX1276/SX1277/SX1278对比

Lora芯片 SX1276/SX1277/SX1278的比较SX1276/7/8是一种半双工传输的低中频收发器,配备标了标准FSK和远距离扩频Lora调制解调器。该芯片可以用于超长距离的Lora扩频通信,并且抗干扰性强,同时达到低功耗要求。1、芯片关键参数对比: 可以看出SX1276的带宽范围为 7.8~500kHz ,扩频 因子6~12,并覆盖所有可用频段。 SX1277的带宽和频段方位与 S

HowieXue 薛永浩的博客 1万+

计算机组成原理---第二章数据的表示和运算---定点数的表示和运算---应用题

计算机组成原理---第二章数据的表示和运算---定点数的表示和运算---应用题

programmer9的博客 475

负数的二进制 原码反码补码

https://blog.youkuaiyun.com/weixin_38296030/article/details/88353914 问题来源: "为毛 -x=!x+1 ??? 其中x为一任意int型正整数,左式表示取x的相反数后的二进制形式,右式表示先将x的二进制按位取反后再加一得到的二进制形式。 左右两个二进制相同" 假设有一个 int 类型的数,值为5,那么,我们知道它在计算机...

3387

返回值的意思,简单理解

返回值就是子程序或者函数执行结束后返回给主程序或者调用函数的函数的值。 比如 int max(int x,int y){ if(x>y) return x; else return y; } 返回x,y中较大的值。 如果在其他处调用,例如 int a = max(1,2); max返回的值赋给了a,此时a=2。 ...

qq_61537872的博客 2万+

vb 原油分离器液滴速度计算

油气田地面工程 气液分离器中液滴下落速度计算,提供4种方法

红太阳教育网站

红太阳教育网站

输出和返回值区别

写了一段代码递归二分查找,如下: #include <iostream> using namespace std; int BinarySearch(int a[], int x, int left,int right) { int mid = (left+right)/2; if(x == a[mid]) { return mid; ...

念去去 7418

WEB下载控件(ReYoWebDownLoad)最新版

API说明 ReYoWebDL.copyright="锐洋软件拥有版权 http://www.interdrp.com/" //必须 ReYoWebDL.url="http://dl.baofeng.com/storm3/Storm2009-0504-1.exe" //下载文件的路径 ReYoWebDL.path ="" //保存文件地址 ReYoWebDL.ReYoStartDownload() //下载动作 ReYoWebDL.ReYoStopDownload() //停止下载 ReYoWebDL.size //下载文件大小 ReYoWebDL.bytes//已下载大小 ReYoWebDL.speed //下载速度 KB/S ReYoWebDL.done //下载是否完成 ReYoWebDL.cancle=true; //是否取消下载 ReYoWebDL.urlsource //下载文件名 ReYoWebDL.percent //下载百分比

二进制原码反码补码详解

原码 反码 补码详解

weixin_45997340的博客 7290

c++C语言 萝莉喵喵

c++C语言c++C语言 萝莉 喵喵

彩色工具栏

将工具栏变为彩色工具栏

Java——二进制原码、反码和补码

原码、反码和补码只是三种二进制不同的表示形式,每个二进制数都有这三个形式。

Stewie Lee的博客 9526

PVE 9.0 保姆级安装及优化教程(换源、网络配置、远程唤醒等)【基础篇】

最近,Proxmox VE 推出了基于 Debian 13 的 9.0 版本。正巧我手头有一台闲置的老电脑,与其闲置,不如装上 PVE,让它化身 All in One,继续发挥它的余热。G4560 算是一颗 NAS 神 U,十几元的售价就能有双核四线程,比起什么 J1900 不知道强到哪里去了,尽管定位上是奔腾处理器,但性能甚至能和同代的酷睿 i3-7100 掰掰手腕,并且它还自带 HD 610 的核显,对于解码的支持也还不错。

zc_mk的博客 7511

二进制 原码 反码 补码

1、原码,反码和补码概念 正数:原码、反码、补码相同; 以123为例: 原码:01111011 反码:01111011 补码:01111011 负数的原码:为取绝对值的数转二进制,然后符号位加一; 负数的反码:对该数的原码除符号位外,各位取反; 负数的补码:对该数的反码加1。--负数的补码即为负数的二进制数。 以-123为例: 原码:11111011,其中最高位1为符号位。 ...

cinling123的专栏 1万+

ollama服务暴露公网?三步搞定Nginx反向代理配置(避坑指南)

本文详细介绍了如何通过Nginx反向代理安全地将Ollama服务暴露到公网,避免直接修改OLLAMA_HOST带来的安全隐患。文章提供了从SSL证书部署到高级安全加固的全流程实战指南,包括IP白名单、基础认证、速率限制等企业级安全措施,帮助用户实现安全可靠的外部访问。

wood5的博客 177

PID温控实验平台搭建(二)——PID进阶知识介绍及源码分享

最近,我突发奇想去翻阅了一些我本科期间所做的一些小项目,发现都挺有意思的!希望通过我的讲解文章可以帮助你们少走一些弯路!今天,我要分享的是一个PID温控实验平台的搭建,这是一个系列文章,手把手地教你学习和认识PID算法,了解这种算法在温度控制中的应用。由于我知识有限,如果出现一些错误,希望大家可以帮助我指出来,我们一起学习进步!!!

qq_35953617的博客 8049

二进制数的原码,反码,补码,以及0的补码,有符号数,无符号数

关于这点其实很多人一知半解,今天特此做一个梳理。 首先看几个例子: 假设计算机字长为8位 1的原码(8位):0000_0001 反码、补码跟原码一样。 -1的原码(8位):1000_0001 反码 :1111_1110 补码 :1111_1111 0有+0和-0之分 +0的原码(8位):0000_0000 反码、补码同。 -0的原码(8位):1000_0000 反码 ...

edward_zcl的博客 3万+

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1111

原码、反码、补码二进制表示

学习目标 1、什么是二进制,谈谈你的理解 2、什么是原码,补码以及反码 3、序号15的视频讲解了一个案例分析,自己试着分析一个新的数 4、如何求一个负数的补码 二进制:0和1组成的数字系列,逢二进一。对于计算机而言,只认识0和1,数据在计算机的存储都是以二进制的形式存储。 原码,反码,补码,都是计算机用二进制来表示数据的,计算机表示数据是由数据长度和符号位表示的,首位表示符号位,0表示正数,1表示负数,剩下的数据表示所要表示的数据。 什么是数据长度? 就是我们说的位数,例如,by

weixin_38982114的博客 6241

LDA模型中文文本主题提取丨可视化工具pyLDAvis的使用

主题模型LDA的实现及其可视化pyLDAvis1. 无监督提取文档主题——LDA模型1.1 准备工作1.2 调用api实现模型2. LDA的可视化交互分析——pyLDAvis2.1 安装pyLDAvis2.2 结合gensim调用api实现可视化p.s. 保存结果为独立网页p.p.s. 加快prepare速度?2.3 如何分析pyLDAvis可视化结果2.3.1. **每个主题表示什么意义?**2.3.2 每个主题有多么普遍?2.3.3 主题之间有什么关联? 1. 无监督提取文档主题——LDA模型 这个模型

qq_39496504的博客 6万+

【嘉立创EDA】PCB 多层板如何交换内层,4层板交换板层

本文使用嘉立创EDA,描述如何在PCB设计时,如何交换各个板层,特别是4层板需要交换内层时,应该如何操作,以供有需要的读者参考。

l64481000的博客 2015

二进制的原码、反码、补码

二进制的原码、反码、补码

m0_62907534的博客 6048

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 812
上一篇: ANSI C中常见的字符串函数
下一篇: gcc和g++的区别
Clef
博客等级 码龄12年 125粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值