为什么需要我们手动进行大的数据类型转小的数据类型
我们的计算机可以自主进行数据类型的小转大,但无法自主进行大转小的操作,此时我们就需要进行强制转换。但为什么不能?以int与byte来说,int为4字节,即二进制位数32;byte为1字节,即二进制位数为8。把int转为byte,就要把它的所有数据装进byte的小盒子里,就算是int a=10;byte b=a;哪怕int里就是一个小小的10,在二进制表示中还是有很多位,即0000 0000 0000 0000 0000 0000 0000 1010,byte的八个位置的小盒子装不下32位的数。此时不进行强制转换,会报错。
对这样的情况,就可以int a=10;byte b=(byte)a;此时就可以输出b=10;
强制转换不可用的情况
强制转换的原理是切除,切除去前面的数据,只将后面的可以“装下”的数据保留下来。因此,强制转换不是处处都可以用的,强行使用会造成数据信息的丢失。不可用的情况,是大的数据类型数字太大,超过小的数据类型,此时强制转换,结果绝对不会是好的,如0100 0000 0000 0000 0000 0000 0000 0000,如128与-128的情况,本质也是128这个数超过了byte的范围(-128-127)。
但在这个基础上,我们来讲讲为什么是输出-128。
原码,反码,补码
(为什么存在以及详细的解释加油自己去查,推荐链接)
正数的原码,反码,补码都是原码;
负数的反码是原码除第一位(符号位)外其余都求反,补码是在反码的基础上加一;
我总结一个规律,如byte中-1的补码1111 1111,将第一位换为0就是127的原码0111 1111,进而得出一个想法,“负数的补码除第一位为1,其余数字与其绝对值相补的数的原码相同”,即|-1|+127=128。如何判断相补?byte的范围是-128~127,共256位,256/2=128,相加等于128就行。
因为计算机存储数据是存储其补码,但是总的大致是第一位是0就是正,是1就是负,为此就出现了128变输出-128的情况—128的补码为0000 0000 1000 000(原补相同)强行转换数据类型切除后就是1000 0000,1就位于符号位,计算机认为是负数,又-128与0相补(-0为0000 0000,+0为1000 0000),输出就是-128(此处“计算机认为”没有依据,我为了使人(就你们)理解这么说)
顺便一提,-128没有原码和反码哦(原因自己查)