⭐️问答小剧场⭐️
以下会产生信息丢失的类型转换是( )
A.float a=10;
B.int a =(int)8846.0;
C.byte a=10;int b=-a
D.double d=100
🎃1.八大基本数据类型族谱
Java的八大基本数据类型包括——byte、char、short、int、long、float、double、boolean(不包括String)。 其中byte、shory、int、long为整数类型,char为字符类型、float、double为浮点数类型(也可以理解为小数类型),boolean为布尔类型,只能取boolean或者false。
八大基本数据类型基本信息(建议收藏):
🎃2.八大类型细节解析
🎨1.byte
byte是Java八种数据类型之一的字节关键字。我们通常说的占几个字节说的就是它了,byte由8个bit位组成。一个bit位指的是二进制的一位,也就是只能取0和1。但我们Java中除了boolean和char不区分正负号,其余类型都是有正负的,为了表示正负Java中用最高位的1个bit位来表示正负,0为正,1为负。我们直接通过二进制来找一找byte的取值范围
//首位为0表示正数,为1表示负数 String a="01111111"; System.out.println(Integer.parseInt(a,2));//127
从结果来看我们知道,当后面7位全取1首位取0时,byte能取到最大值为127,当首位为1时,取到最小负数为-127。诶?不对啊,上面明明说byte取值是[-128,127],照你这么说-128去哪了?别急,其实大家都忽略了一个问题,0是没有正负的,所以这时你不能说无论首个bit位是0还是1都当做0,这样肯定是不行的,不仅容易出问题还浪费资源空间。所以我们规定当为10000000时,看上去好像是-0,我们就把它当做为-128。这个大家了解一下即可,因为其中还涉及到一些正反补码的知识。
byte a= (byte)0B10000000; System.out.println(a);//-128
1.赋值报错以及强转原则
先看上图的报错信息,首先a和b报错,提示我们提供的类型不对,这是因为我们赋的值超出了byte的取值范围,而且在Java中默认的整数类型为int,浮点数类型为double 。所以它这提示我们提供的类型不对。有的人肯定就说了,诶你不会强转吗?在我们Java中大的数据类型可以强转成小的数据类型 。难道你不知道吗?别急,当然可以强转,我们试试给两个超出byte范围内的值强转会怎样
byte a=(byte)10000; System.out.println(a);//16
会发现10000强制后得到了16,它是怎么得来的呢?别急,我们来看看10000和16的的二进制表示
System.out.println(Integer.toBinaryString(10000));//100111 00010000 System.out.println(Integer.toBinaryString(16));//00010000
发现没,10000的二进制表示的后八位,就是16的二进制表示,因为int类型占4个字节也就是32个bit位,而我们byte只有8个,所以当int强转为byte时,我们只取int的后8个bit位,取到多少则强转为多少。但是这里要注意我举的例子强转前后都是正数,当有负数时会发现好像我们的结论不成立,那是因为计算机在储存负数时是以反码的格式存储,我们平时看见的二进制都是正码,想深入了解的同学可以找文章了解一下,想自己举例验证的尽量都举一个强转前后都为正数的例子。
2.参与运算升级为int
有些同学肯定会很纳闷,诶不对啊,我这两个byte一个10一个20相加得到30,30也没超出byte取值范围,咋说我得到的结果是int呢?这是因为在Java中有规定:在有byte、char、short参与运算时,得到的结果会自动提升为int类型。这是很多初学者都忽略的问题,大家一定要了解,这时是需要进行强转的,当然因为30并未超出byte取值范围,强转后c也为30。