原码反码补码

Posted kyin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原码反码补码相关的知识,希望对你有一定的参考价值。

数在计算机中是以二进制形式表示的。 
数分为有符号数和无符号数。 
原码、反码、补码都是有符号定点数的表示方法。 
一个有符号定点数的最高位为符号位,0是正,1是副。 
 
以下都以8位整数为例, 
 
原码就是这个数本身的二进制形式。 
例如
0000001 就是+1
1000001 就是-1 
 
正数的反码和补码都是和原码相同。 
 
负数的反码是将其原码除符号位之外的各位求反 
[-3]反=[10000011]反=11111100 
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。 
[-3]补=[10000011]补=11111101 
一个数和它的补码是可逆的。 
 
为什么要设立补码呢? 
 
第一是为了能让计算机执行减法: 
[a-b]=a+-b)补
 
第二个原因是为了统一正0和负0 
正零:00000000 
负零:10000000 
这两个数其实都是0,但他们的原码却有不同的表示。 
但是他们的补码是一样的,都是00000000 
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!) 
[10000000]补 
=[10000000]反+1 
=11111111+1 
=(1)00000000 
=00000000(最高位溢出了,符号位变成了0) 
 
有人会问 
10000000这个补码表示的哪个数的补码呢? 
其实这是一个规定,这个数表示的是-128 
所以n位补码能表示的范围是 
-2^(n-1)到2^(n-1)-1 
比n位原码能表示的数多一个
 
又例:
1011 
原码:01011 
反码:01011 //正数时,反码=原码 
补码:01011 //正数时,补码=原码 
 
-1011 
原码:11011 
反码:10100 //负数时,反码为原码取反 
补码:10101 //负数时,补码为原码取反+1 
 
0.1101 
原码:0.1101 
反码:0.1101 //正数时,反码=原码 
补码:0.1101 //正数时,补码=原码 
 
-0.1101 
原码:1.1101 
反码:1.0010 //负数时,反码为原码取反 
补码:1.0011 //负数时,补码为原码取反+1 
 
在计算机内,定点数有3种表示法:原码、反码和补码
 
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
 
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
 

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

 

 

两正数相加怎么变成了负数???

1)(+72)+(+98)=?

0 1 0 0 1 0 0 0 B +72

0 1 1 0 0 0 1 0 B +98

1 0 1 0 1 0 1 0 B -86

两负数相加怎么会得出正数???

2)(-83)+(-80)=?

1 0 1 0 1 1 0 1 B -83

1 0 1 1 0 0 0 0 B -80

0 1 0 1 1 1 0 1 B +93

思考:这两个题目,按照正常的法则来运算,但结果显然不正确,这是怎么回事呢?

答案:这是因为发生了溢出。

如果计算机的字长为n位,n位二进制数的最高位为符号位,其余n-1位为数值位,采用补码表示法时,可表示的数X的范围是 -2的n-1次幂≤X≤2的n-1次幂-1

当n=8时,可表示的有符号数的范围为-128~+127。两个有符号数进行加法运算时,如果运算结果超出可表示的有符号数的范围时,就会发生溢出,使计算结果出错。很显然,溢出只能出现在两个同符号数相加或两个异符号数相减的情况下。

对于加法运算,如果次高位(数值部分最高位)形成进位加入最高位,而最高位(符号位)相加(包括次高位的进位)却没有进位输出时,或者反过来,次高位没有进位加入最高位,但最高位却有进位输出时,都将发生溢出。因为这两种情况是:两个正数相加,结果超出了范围,形式上变成了负数;两负数相加,结果超出了范围,形式上变成了正数。

而对于减法运算,当次高位不需从最高位借位,但最高位却需借位(正数减负数,差超出范围),或者反过来,次高位需从最高位借位,但最高位不需借位(负数减正数,差超出范围),也会出现溢出。

在计算机中,数据是以补码的形式存储的,所以补码在c语言的教学中有比较重要的地位,而讲解补码必须涉及到原码、反码。

在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负;其余n-1位为数值位,各位的值可为零或一。当真值为正时,原码、反码、补码数值位完全相同;当真值为负时,原码的数值位保持原样,反码的数值位是原码数值位的各位取反,补码则是反码的最低位加一。注意符号位不变。

以上是关于原码反码补码的主要内容,如果未能解决你的问题,请参考以下文章

一个数的原码,反码,补码怎么算

原码反码补码

原码反码补码

知道 补码,如何 计算 原码

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

原码反码补码与位运算