技术思绪摘录旅行
这是一篇非常神奇,并且知识点丰富的文章,让你知道计算机是如何让1+1=2的,如何让1-1=0的,了解计算机底层,能帮助我们了解我们写的代码,到底消耗了多少性能,知己知彼百战百胜嘛。

    首先我们得了解以下基本知识点:

        1、计算机运算是操作的二进制数,人类一般使用的是十进制数,二进制就是只有0和1组成的数。

        2、1字节(byte)=8位(二进制位bit),每个二进制位可能是0或者1。


    举个例子:

        1个字节的空间来存储1,那么存的就是:0000 0001

        1个字节的空间来存储-1,那么存的就是:1000 0001

        看出来了没:二进制表示数,最高位为符号位,0表示正数,1表示负数。        


    新知识点如下:

        1、二进制表示数,最高位为符号位,0表示正数,1表示负数。

        2、原码:就是二进制码。

        3、反码:正数的反码和原码一样;负数的反码,除了符号位,其他位按位取反,0变1,1变0。

        4、补码:正数的补码和原码一样;负数的补码,在反码基础上+1。

        5、移码:正数和负数一致的规则,在补码的基础上,符号位取反。



数值1

数值-1

原码

0000 0001

1000 0001

反码

0000 0001

1111 1110

补码

0000 0001

1111 1111

移码

1000 0001

0111 1111


    原码计算加法,完全没问题,但是当我们计算减法的时候,1+(-1)为例:

    


数值1

数值-1

1+(-1)

原码

0000 0001

1000 0001

1000 0010

反码

0000 0001

1111 1110

1111 1111

补码

0000 0001

1111 1111

0000 0000

移码

1000 0001

0111 1111

1000 0000


    首先看原码:1-1=1000 0010=-2 (错误的结果)

    再看反码:1-1=1111 1111=-0(符号位不对,看着不对劲)

    再看补码:1-1=0000 0000=0(完全正确)

    再看移码:1-1=1000 0000=0(完全正确)


    移码和补码都对,移码(又叫增码)是符号位取反的补码,一般用指数的移码减去1来做浮点数的阶码,引入的目的是为了保证浮点数的机器零为全0。

    移码是用来解决其他的问题的,所以先不纠结为啥两个算法结果都对了。


    看到这里,是否有觉得二进制的巧妙,发明者真是很厉害,非常巧妙的算法节省了计算机的性能,相当于计算机只需要会加法就行,任何运算都当成加法处理即可。


    了解了符号位,我们就知道,在sql中,int数字类型占4个字节,为啥最大值是21个亿了,因为最高位是符号位,二进制数据只有31个长度,2的31次方就是最大的int数据。

CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

精选推荐

阅读排行

友情打赏

请打开您的微信,扫一扫