原码反码补码

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

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

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

最后,来介绍补码。我通过各种负数的跨0计算,发现了一个问题,就是按照上面负数反码的的计算方法,-23本应该等于1,但是却得到0-47本应该是3,却得到2。也就是,负数的跨零计算的结果会比正确结果小1,原因是0有两种表现形式,0000000010000000,计算机在负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,这只是简写之后的值。

posted @   小白同学321  阅读(206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示