ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

原码反码补码

2022-09-11 09:01:35  阅读:140  来源: 互联网

标签:反码 二进制 补码 负数 十进制 原码


说实话,知道大一学习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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有