前言:
我是张哲,一位在互联网上不愿透露姓名的小学员,接下来大家看到的所有内容都是我背写的知识点,这里的知识点和你所学习到的不同,我中和了我的一些书籍和网上刷的面试笔记,相信这里能让你接触到更深入的知识点,我会慢慢的把我对某个知识点的理解写进去。
二进制的三种表现形式:
数据在计算机中的存储是二进制的形式,二进制简单来说就是0和1组合的,无论原码,反码还是补码,都是二进制的形式
正数的原码、反码和补码
正数这个很好理解,正数的原码、反码和补码一样,也就是说正数转成二进制的三个码是相同的
这里拿15来举例子,15是个常数,默认是int类型,而int类型是4个字节,1Byte=1bit,所以int类型占32个bit。下面这个是15的原码、反码和补码:
15的原码 00000000 00000000 00000000 00001111
15的反码 00000000 00000000 00000000 00001111
15的补码 00000000 00000000 00000000 00001111
负数的原码、反码和补码
这里要先说一说二进制的符号位,也就是最高位,通俗来讲是最左边的那个位,如果最左边的那个位是0,则是正数,如果是1则是负数,比如下面 -5 和 5 的原码二进制
00000000 00000000 00000000 00000101 是5的原码
10000000 00000000 00000000 00000101 是-5的原码
下面说说负数的原码、反码和补码的规律,负数的原码是正数原码的最高位改为1,这个上面已经体现过了,负数的反码是它的原码的每一个bit位反转,也就是:原为1,得0;原为0,得1,这里大前提就是符号位不变,也及时最左边的那个1不变,下面这个是-15的原码、反码和补码:
-15的原码 10000000 00000000 00000000 00001111
-15的反码 11111111 11111111 11111111 11110000
-15的补码 11111111 11111111 11111111 11110001
最后说一下为什么要存在补码:
在讨论这个话题前我们先来看看0和-0的原码和反码
0的原码 00000000 00000000 00000000 00000000
-0的原码 10000000 00000000 00000000 00000000
0的反码 00000000 00000000 00000000 00000000
-0的反码 11111111 11111111 11111111 11111111
这里就会存在一个争议,很难受啊,无论是-0还是0,不都是0吗? 所以就出了补码。
因为-0补码是反码+1,所以先来看看他们的补码
0的补码 00000000 00000000 00000000 00000000
-0的补码 00000000 00000000 00000000 00000000
你看啊,-0的原码是一串1,在加1不就是一串0了呗,所以这就很好的解决了-0和0的矛盾,现在-0和0的补码是相同的。因此计算机以补码的形式来存储的。