ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

原码反码与补码

2022-09-12 11:03:36  阅读:155  来源: 互联网

标签:0000 补码 源码 反码 原码 1000


原码、反码和补码出现的原因?

由于计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储。

根据冯·诺依曼提出的经典计算机体系结构框架,一台计算机由运算器、控制器、存储器、输入和输出设备组成。

其中运算器只有加法运算器,没有减法运算器(据说一开始是有的,后来由于减法运算器硬件开销太大,被废了)。

所以计算机中没办法直接做减法的,它的减法是通过加法实现的。现实世界中所有的减法也可以当成加法的,

减去一个数可以看作加上这个数的相反数,但前提是要先有负数的概念,这就是为什么不得不引入一个符号位。

符号位在内存中存放的最左边一位,如果该位位0,则说明该数为正;若为1,则说明该数为负。

而且从硬件的角度上看,只有正数加负数才算减法,正数与正数相加,负数与负数相加,

其实都可以通过加法器直接相加。原码、反码、补码的产生过程就是为了解决计算机做减法和引入符号位的问题。

 

什么是原码?

原码就是机器数,是加了一位符号位的二进制数,正数符号位为0,负数符号位为1,

计算机中存储、处理、运算的数据通常是8位、16位、32位或64位的,这里以最简单的8位为例讲解。

注意符号位是包含在8位中的其中1位,故可直观读出的数只有7位(只有后7位数可以按权展开)。

有心人可能注意到原码是有缺陷的,它只能表示255种状态,因为00000000(+0)和10000000(-0)其实是一个数,

因此原码的表示范围成了-127到+127,这个问题需要神奇的补码来解决,因为在补码中10000000被用来表示-128。

正数源码: 120 0111 1000
负数源码: -23 1001 0111
0的源码: 0 0000 0000
-0的源码: -0 1000 0000
1的源码: 1 0000 0001
-1的源码: 1 1000 0001
1+(-1) 1000 0010 = -2
若内存中用源码存储,会导致数据的运算结果不对,且0的状态有两种

什么是反码?

反码,英语里又叫ones' complement(对1求补),这里的1,本质上是一个有限位计数系统里所能表示出的最大值,

在8位二进制里就是11111111,在1位十进制里就是9,在3位十六进制里就是FFF(再大就要进位了)。

求反又被称为对一求补,用最大数减去一个数就能得到它的反,

很容易看出在二进制里11111111减去任何数结果都是把这个数按位取反,0变1,1变零,所以才称之为反码。

原码求反码的方法是,正数不变,负数保留符号位1不变,剩下位按位取反。

120
原码:0111 1000
反码:0111 1000
-23
原码:1001 0111
反码: 1110 1000
0,-0,1,-1的反码
0源码:0000 0000
0反码:0000 0000
-0源码:1000 0000
-0反码:1111 1111
1源码:0000 0001
1反码:0000 0001
-1源码:1000 0001
-1反码:1111 1110
1+(-1)=1111 1111(等于-0的反码)如果计算机中用反码存,负数运算结果正确,但是0的状态有2种

什么是补码?

补码,英语里又叫two's complement(对2求补),这个2指的是计数系统的容量(模),

就是计数系统所能表示的状态数。对1位二进制数来说只有0和1两种状态,所以模是10也就是十进制的2,

对7位二进制数来说就是10000000,这个模是不可能取到的,因为位数多一位。

用模减去一个数(无符号部分)就能得到这个数的补,比如10000000-1010010=0101110,

事实上因为10000000=1111111+1,稍加改变就成了(1111111-1010010)+1,所以又可以表述为先求反再加1。

总结求补码的方法就是正数依旧不变,负数保留符号位不变,先求反码再加上1。

正数的补码 = 反码=原码
负数的补码 = 反码 +1
0源码:0000 0000
0补码:0000 0000

-0源码:1000 0000
-0反码:1111 1111
-0补码:0000 0000(加1溢出后全置0)

1源码:0000 0001
1补码:0000 0001

-1源码:1000 0001
-1反码:1111 1110
-1补码:1111 1111

标签:0000,补码,源码,反码,原码,1000
来源: https://www.cnblogs.com/liucaizhi/p/16685682.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有