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

  • 机器数:一个数在计算机中的二进制表示形式,称为这个数的机器数。
  • 符号位:机器数是带符号的,在计算机中用最高位作为符号位,0为正数,1为负数。
  • 真值:机器数由于含有符号位,所以机器数的值并不等于真实值。将带符号位的机器数所对应的真实数值称为机器数的真值。
  • 为便于计算,带符号的机器数可采用原码、反码、补码、移码等不同编码方式。
  • 原码:是最简单的机器数表示法,用最高位表示符号,其余位表示该数的二进制绝对值。
  • 反码:正数的反码是其本身,负数的反码是符号位不变,其余位取反。(在反码中,数值0有两种表示方法)(原码最大的问题就在于一个数加上它的相反数不等于0,反码的设计思想就是为了解决这个问题,既然一个负数是一个正数的相反数,那干脆用一个正数按位取反来表示负数)

此时,再试着用反码的方式解决一下源码的问题:0000 0001 + 1111 1110 = 1111 1111,即1+(-1)= -0 结果正确;1111 1110 + 1111 1100 = 1111 1010,(-1)+(-3)= -5,结果错误。两个相反数相加等于0,但是两个负数相加结果不对。

  • 补码:正数的补码是其本身,负数的补码是其反码+1。(这只是求法,并不是补码定义)
  • 移码:不管正负数,只要将其补码的符号位取反即可。
  • 八位二进制数0000 0000 ~ 1111 1111 共2^{8}=256个数,如果无符号整数可表示0~255。如果是有符号整数,第一位二进制位为符号位,其余位为数值域。
  • 在原码中,0的表示有两种(+0)0000 0000和(-0)1000 0000,这样就产生了编码映射的不唯一性,在计算机上就要去区分,然而+0和-0并没有现实意义。
  • 为解决上述数的表示问题,我们强制把转换后的1000 0000认定为-128,但这又出现了一个新的问题,即数的运算
  • 为解决上述数的运算问题,进行如下思考:在数学上,1+(-1)=0,而在二进制中,0000 0001 + 1000 0001=1000 0010,换算成十进制为-2,显然是错了。所以原码符号位不能直接参与运算,必须和其他位分开,但这增加了硬件的开销和复杂性。这个时候就要引入补码。为何引入补码?负数补码定义为何是相应的正数原码取反加一?
  • 为何引入补码?是为了解决计算机中数的表示和数的运算问题,使用补码,可以将符号位和数值域统一处理,即引用了模运算在数理上对符号位的自动处理,利用模的自动丢弃,实现了符号位的自然处理,仅仅通过编码的改变就可以在不更改机器物理架构的基础上完成预期要求。
  • 为何取反加一?模的概念可以帮助理解补数和补码。“模”指的是一个计量系统的计量范围。如时钟的计量范围是0~11,模=12;n位计算机的计量范围是0~2^{n-1},模=2^{n}。“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法运算为加法运算。例如:当前时针指向10点,而准确时间是6点,调整时间有以下两种拨法:一种是倒拨4个小时,即10-4=6;另一种是顺拨8小时,即10+8=12+6。在以12为模的系统中,加8和减4的效果是一样的,因此可以化减法运算为加法运算。对“模”而言,8和4互为补数。在以12为模的系统中,11和1,10和2,9和3,7和5, 6和6都有这个特性,共同特点是两者之和等于模。对于计算机而言,其概念和方法完全一样,n位计算机,假设n=8,不讨论符号位,则所能表示最大的数是1111 1111,若再加1,成为10000 0000,但因为只能有8位,最高位1自然丢失。又回到了0000 0000,所以8位二进制系统的模为2^{8}。在这样的系统中,减法运算也可化为加法运算,只需把减数用相应的补数表示就可以,把补数用到计算机对数的处理上,就是补码。
  • 正数的补码表示就是其本身,负数的补码表示的实质是把负数映像到正值区域,因此加上一个负数或减去一个正数,可以用加上另一个数(负数或减数对应的补码)来代替。从补码表示的符号看,补码中符号位的值代表了数的正确符号,0表示正数,1表示负数;而从映像值来看,符号位的值是映像值的一个数位,因此在补码运算中,符号位可以与数值位一起参加运算。
  • 八位二进制数表示范围为-128~+127。

举例:

不考虑符号位:

0110-0010,6-2=4,但是由于计算机中没有减法器,没法算。这时候,想想时钟运算中,减去一个数,是可以等同于加上另外一个正数(同余数),这个数与减数相加正好等于模。也就是四位二进制数最大容量是多少?其实就是2^4=16(10000)。那么-2的同余数,就等于10000-0010=1110,16-2=14。既然如此,0110-0010=0110+1110=10100,6-2=6+14=20。按照这种算法得出的结果是10100,但是对于四位二进制数最大只能存放4位,如果低四位正好是0100,正好是想要的结果,至于最高位的1,计算机会把它放入psw寄存器进位位中,8位机会放在cy中,x86会放在cf中,这里不做讨论。此时,再想想在四位二进制数中,减去2就相当于加上它的同余数(至于它们为什么同余,建议看《计算机组成原理》)。但是减去2,从另一个角度来说,也是加上-2,即加上-2和加上14得到的二进制结果除了进位位,结果是一样的。如果我们把1110的最高位看作符号位后就是-2的补码,这可能也是为什么负数的符号位是1,而不是0。

       

在补码中也不存在-0了,因为1000表示-8。

参考文献:(强烈推荐第一个引用文献

(5 封私信) 为什么-8对应的原码、补码是1000,反码是1111? - 知乎 (zhihu.com)

《 模拟工程师口袋书》

二进制的原码、反码、补码 - 知乎 (zhihu.com)

八位二进制数能表示数的范围以及原码、反码和补码含义_8位2进制-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技驱动固定资产管理变革:RFID技术的前沿应用

在当今激烈竞争的商业环境中,企业固定资产管理面临挑战,而RFID技术正以其独特特性和功能性彻底改变资产管理方式。本文将深入探讨RFID技术在固定资产管理中的革命性作用,并解析其应用带来的创新和便利。 RFID技术概述: RFID系统作…

Vue中methods实现原理

目录 前言 回调函数中的this指向问题 vue实例访问methods methods实现原理 前言 vue实例对象为什么可以访问methods中的函数方法?methods的实现原理是什么? 回调函数中的this指向问题 在解答前言中的问题前,需要了解一下回调函数中的th…

[sd_scripts]之train

https://github.com/kohya-ss/sd-scripts/blob/main/docs/train_README-zh.mdhttps://github.com/kohya-ss/sd-scripts/blob/main/docs/train_README-zh.md 支持模型fine-tune,dreambooth,lora,textual inversion。 1.数据准备 在任意多个…

K8S 集群搭建

1、搭建清单 2台linux服务器(一个master节点,一个node节点),建议搭3台(一个master,两个node) 我使用的是腾讯云,节点与节点使用公网IP通信 确保2台服务器都安装了docker 2、服务…

kafka单节点创建 topic 超时

1.根据之前的知道,安装kafka的时候改了config的server.properies文件中的listeners配置 之前这一行是没有注释掉的,结果创建topic的时候时钟报错连接超时 结果资料,发现就是因为listeners的问题 https://blog.csdn.net/weixin_42133361/art…

汽车标定技术(九)--标定常量与#pragma的趣事

目录 1. 不添加#pragma语句 2. 添加#pragma语句 3. 标定量只给flash空间,不给ram指定空间 4. 总结 在之前不会使用overlay机制的时候,我们想要做汽车标定,标定常量编译出来的地址一般都应该是ram的地址,而且在链接文件中都会指…

安装DevEco Studio时,遇到的ohpm报错(解决)

如上图所示,我试了网上的各种办法,包括官网的文档,运行init.bat也不行。 接下来我说一下我的办法: 我从官网下载安装包后,将bin文件添加在了环境变量里(最终安装的位置,但是因为他会自己下载所…

STM32 LED编程 GPIO的初始化(标准库)

实验的电路图介绍 实验的电路图类似于开漏接法 要初始化GPIOC接口 标准库的模板 GPIO的标准库编程接口 GPIO引脚的初始化 GPIO作为片上外设 每一个片上外设使用前一定要使能时钟 为什么要使能时钟?时钟是啥 时钟的使能 stm32的每一个片上外设都是时序电路 时序…

【Linux网络】1分钟使用shell脚本完成DNS主从解析服务器部署(适用于centos主机)

DNS正向解析主从解析服务器脚本 1、脚本内容 主服务器脚本 #!/bin/bash ##先修改本地DNS缓存服务器 read -p "请输入主服务器ip地址:" masterIP sed -i /DNS/d /etc/sysconfig/network-scripts/ifcfg-ens33 echo "DNS$masterIP" >> /e…

链表面试题

💓作者简介👏:在校大二迷茫大学生 💖个人主页🎉:小李很执着 💗系列专栏:Leetcode经典题 每日分享:其实要过那条马路并不难,就看谁在对面等你❣️❣️❣️ 目录…

error: C3867: “MainWindow::copyFileCallBack”: 非标准语法;请使用 ““

error: C3867: “MainWindow::copyFileCallBack”: 非标准语法;请使用 “&” 这时候我们按照提示将t.testFun前面加上&又会出现error C2276: “&”: 绑定成员函数表达式上的非法操作, 解决 在函数前面加上static声明

ISP 处理流程

#灵感# 摆烂时间太长了,感觉知识忘光光了。重新学习,常学常新。 因为公司文档都不让摘抄、截取,所以内容是工作的一些自己记录和网络内容,不对的欢迎批评指正。 1、ISP概述 ISP是Image Signal Processor 的简称,也就…