其他分享
首页 > 其他分享> > 原码反码与补码

原码反码与补码

作者:互联网

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

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

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

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

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

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

符号位在内存中存放的最左边一位,如果该位位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