其实吧,在我们学习C语言中会遇到好多令人头疼的问题,比如说,原码,反码,补码。看见很简单的三个词,可是真正理解起来会非常的麻烦,那么我在这里就跟大家一起来重新学习一下原码,反码,补码。
首先让我们弄明白,什么是原码,什么是反码,什么是补码,要想学会这个,我们首先要弄明白他们的定义。
所谓的原码,就是指有符号的整数的二进制。原码本身简单一易懂在这里就不做过多的解释
例如:
00000001=1
10000001=-1
反码,就是把原码的符号位不变其余的位进行取反。最高位还是一样,当为1的时候是正,当为0的时候是负。对于正数来说,正数的反码跟原码是相同的,对于负数来说,符号位是保持不变其余位置进行取反操作,
例如:
正数100的原码为:01100100 则100的反码也为:01100100
负数100的原码为:11100100 则它的反码为:10011011
此时需要注意:0也有两种表现形式。
说起来反码理解相对而言还算简单,那么接下来让我们继续学习补码
补码,对于正数来说,补码跟原码是相同的,对于负数而言,符号位还是保持不变,其数值位x的据对峙取反后再最低位+1。在计算机中的储存都是用补码来处理的
例如:
+9的原码是:00001001 +9的反码为00001001 +9的补码为00001001
-9的原码是:10001001 -9的反码为11110110 -9的补码为11110111
注意:在补码中0有唯一的编码。
补码的绝对值之为真值;
以上呢,为原码、反码、补码的简单介绍,综上所述我们对于原码、反码、补码的理解,我认为是相当简单了,那接下来我们看一下他们在实际中的应用,大部分为举例分析
原码的符号位不能直接参与运算,必须和其他位分开。在原码的具体定义中还分为小数和正数
1.小数原码的定义
+0.1011的原码就是0.1011 -0.1011的原码就是 1.1011
2.正数原码的定义(略 前面提起过)
注意,在小数原码的定义时候,代码中的小数点并不会出现在机器内部
反码
在上面提到的数0的反码有两种形式
如下:
+0的反码为:00000000
-0的反码为:11111111
八位二进制反码的表示范围为-128~+127
补码
在补码中,我们会提到模,那么什么叫做模呢?
模的定义:把一个计量单位称之为模或者模数。例如,时钟是以12进制计数循环的,即以12为模。利用模的概念可以把计算的减法变为加法。同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为2^8=256。在计算中,两个互补的数称为“补码”
补码在微型机中是一种重要的编码形式,请注意:
1.采用补码后,可以方便的将减法运算转化成加法运算,运算过程得到简化。
2.与原码、反码不同,数值0的补码只有一个,即000000000B
3.若字长为8位,则不吗所表示的范围为-128~127;进行补码运算时,应注意所得到结果不应超过补码所表示数的范围
下面我们进行一个简单的转化案例:
已知原码,求反码跟补码,原码为10110110B,求出反码和补码
有已知可以知道10110110B为一个负数
则反码为11001001B
它的补码就为11001010B(从末端+1的到补码)