首先我们得了解以下基本知识点:
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)为例:
首先看原码: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数据。
留下您的脚步
最近评论