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

原码反码补码

作者:互联网

说实话,知道大一学习C语言的时候,我才了解原码反码补码这以知识,但只是单纯的学习源码反码补码之间如何转化以及二进制、十进制、八进制、十六进制之间的转换规则,但这几天我通过进一步学习关于原码反码补码的相关知识,我才了解了计算机为什么要采用二进制来进行计算。接下来我来谈一下我对原码反码补码的认识和理解。

首先,我来介绍一下计算机为什么采用二进制以及原码反码补码的概念。1、能表示两种状态,在元器件中容易实现。2、二进制运算规则简单,易于实现。3、二进制可以用逻辑运算实现算术运算。4、用0表示高电平,1表示低电平,抗干扰能力强,在传输时不易出错。原码:十进制的二进制表现形式,最左边是符号位,0为正,1为负。反码:正数的反码补码是其本身,负数的反码是符号位不变,其余位取反。补码:正数的补码是其本身,负数的补码是其本身加1。

然后,为什么有了原码还不够,要设计出反码补码这种东西呢。要解决这个问题,就要了解一下计算机的计算原理。先看正数的原码,例如1的原码00000001,加1是00000010,也就是十进制的2。那么-1的二进制10000001,加1是10000010为十进制的-2,而-1加1的正确结果应该是0,在看0,二进制为00000000,加1是00000001,为十进制的1,结果没有问题,,再看10000000,也为十进制的0,加1为10000001,为十进制的-1,而0加1的正确结果是1。由此看来,在计算机二进制原码的使用过程中,只涉及到正数的加法是没有问题的,但是如果涉及到负数的运算,就会与正确结果相反(例如,-1加1等于0,应该向数轴的正方向移动一位,但是,它却向负方向移动了一位,变成了-2)。为了解决这一问题,就出现了反码这一概念。例如,-2的原码是10000010,反码为11111101,在-2反码的基础上加1,得到的反码为11111110,其原码为10000001,为十进制的-1,结果正确。通过计算其他负数也可以得到正确结果,这里也就明白了反码的作用。

最后,来介绍补码。我通过各种负数的跨0计算,发现了一个问题,就是按照上面负数反码的的计算方法,-2加3本应该等于1,但是却得到0,-4加7本应该是3,却得到2。也就是,负数的跨零计算的结果会比正确结果小1,原因是0有两种表现形式,00000000和10000000,计算机在负0到正0的过程中也消耗了一个1。故此,出现了补码这一概念,当我们在用补码进行跨0计算就会发现,计算结果与正确结果相同。

接着,来介绍以下int类型与double类型转换会出现误差的原因:例如double a,c;int b;

a=2/3*3; c=2.0/3*3;b=2/3*3;接着输出a b c,得到结果a=0.000000 b=0 c=2.000000.如果再加上if(c==2)printf(“ok”);else printf(“error”);输出结果是error。由此可见,c的真实值不是2.000000,这只是简写之后的值。

标签:反码,二进制,补码,负数,十进制,原码
来源: https://www.cnblogs.com/baijingyun/p/16683493.html