【C语言】原码|反码|补码|为什么在计算机中存储的是补码?
原码
- 直接将数字按照正数或者负数形式来转换翻译成二进制就可以了💨
其实还有一个办法可以算补码我一开始就是这样的:
1、假设是负数1的补码你先看成是负数1原码的数字—10001(注意这里的最高位是1,是负数)
2、再直接反码注意最高位不用反码了——11110
3、最关键的一步就是补码了切记补码最后一位加1是1就往前面一位数字进1,结果就是——11111
当然这个是笨办法,如果不能理解的话用这个也是可以的我一开始就是这样😂
反码
将你的符号位不变,也就是最高位不变,其次再依次的按位取反,得到反码。
比如 int = - 10;的反码就是—11111111111111111111111111110101
补码
补码就是 反码+1 就能够得到补码,注意是前提是要反码加一💨
还是 比如 int = - 10;的补码就是—11111111111111111111111111110110
这里注意一下是满2进1,不要弄错了~!
如果它是正数的话:原码、补码以及反码都是相同的!
是负数的话就是我上面说的这样!对于整形来说存放的都是补码,切记!
一个字节=8个bit
为什么在计算机中存储的是补码?
在计算机的系统当中,数值都是用补码来表示存储的。原因在于,使用补码,可以将符号位和数值域进行统一的处理;同时,加法和减法当中用补码也可以进行统一的处理(CPU当中只有加法器),此外,尤其是补码与原码的运算过程是可以进行相互转换的!
那么我着重的跟大家说说这个加法器吧,这个加法器其实就是当中CPU运用的加法运算,好接下来我给大家举个例子比如说:1 - 1 那你要转换成加法器怎么办呢?其实很简单只需要:1 + (-1) 就可以了,那么如果你现在要用原码来算呢?
1的原码: 0000 0000 0000 0000 0000 0000 0000 0001
-1的原码: 1000 0000 0000 0000 0000 0000 0000 0001
结果: 1000 0000 0000 0000 0000 0000 0000 0010 所以,1+(-1) = -2吗?答案显然不是的
好!那现在如果我们用补码来算一下呢
1的补码: 0000 0000 0000 0000 0000 0000 0000 0001
-1的补码: 1111 1111 1111 1111 1111 1111 1111 1111 1111
结果: 1 0000 0000 0000 0000 0000 0000 0000 0000
但是:我们整形当中只能存储的是32位,所以留下的是0,所以用补码进行运算的时候我们是可以算出一个正确的结过的,想到这,我真的觉得当时创作出这个算法的人估计是个神仙吧😯,乘法就是^几次放就加多少,也有可能是转换成某一个运算吧。但是原理都是一样的就是我只要有加法,这些事情我都可以办到。
- 点赞
- 收藏
- 关注作者
评论(0)