Java基本数据类型族谱与易错点梳理解析
问答小剧场
以下会产生信息丢失的类型转换是( )
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。
2.short
这里将short放到前面讲,是因为它和byte的性质其实差不多,只不过它的取值范围更大一些,但依旧小于int。short也是一个短整型数据类型,它占两个字节,那也就是16个bit位。我们同样通过代码尝试找一下它的最大值。
public static void main(String[] args) {
String a="0111111111111111";//首位bit用来表示正负
System.out.println(Integer.parseInt(a,2));//32767
}
我们很容易可以看出short可以取得的最大值为32767,当首位bit位为1时则取到-32767。同样要留心像byte一样-0的情况,这时我们定义它的值为-32768。所以short的取值范围为[-32768,32767] 。short的易错点和byte其实一样,当给short赋值一个超出short的取范围时,数默认为int类型,因为short只占16个bit位,int类型占32个,则会舍掉前16个留后16个给short。同样short参与运算时也会升级为int,所以除了取值范围,short和byte的性质差不多。short也可以说是八大基本数据类型可以说是最冷门的一个了。
3.int
作为最常用的数据类型,int相信是大家最熟悉的基本数据类型了。它占4个字节,也就是32个bit位。这里就不再重复上面步骤。因为是32位,除去一位符号位,在这顺手一提,Java中的基本数据类型中是没有无符号类型的,所以还剩31个bit位表示值。则取值范围为[-2147483648 ~ 2147483647] 。之所以int能成为我们最常用的基本数据类型,就是因为它的取值范围足够我们大多数的场景使用,选太大的long类型占用空间大浪费资源,选太小的short和byte容易溢出,而int的取值范围则恰好合适。
4.long
long类型属于长整数数据类型,它占8个字节,也就是64个bit位。所以它的取值范围为[-9223372036854774808 ~ 9223372036854774807]。可以看出这个数是非常大的,但是因为太占内存,我们很少使用它。通常在运算时可能超出int类型造成溢出,我们才会使用long类型。如果直接给long类型赋值时,我们需要注意在末尾加上L或l,这是为什么呢?我们来用代码看看
发现没,我特意举的这个例子,当数在int范围内它没有报错,当超过int了它居然说整数过大?我long类型最大能取9223372036854774807你居然敢说我过大?难道你把我当成int了?你还真别说,JVM真把你当成int了,因为Java中整数类型都默认为int,你这是一个超过int类型的数它当然会提示过大。所以我们最好养成习惯,在给long类型赋值时,最好在末尾加上个L,告诉JVM我这是个long类型的值。
5.char
char类型属于字符类型,也是我们用的比较多的类型。它的存储占2个字节,也就是16个bit位,和short一样,那取值范围一样吗?当然不一样啦!char是取不了负号的,所以它不需要用1个bit位来表示正负,所以它的取值范围是[0,65535]。有的人肯定纳闷了,诶不对啊,char不是字符类型吗?那不是应该是什么a啊b啊这种字符吗?这就涉及到ACSII表了,我们的每个字符都可以用一个整数去表示,所以当你赋值一个合法范围内的整数,它就会自动转换为对于的字符,具体是什么字符就要去记一下ACSII表了
char a=97;
char b=98;
System.out.println(a);//a
System.out.println(b);//b
如上图,97对于的为字符'a',98对于的为字符'b'。所以大家这里记住,26个小写的字母对应的ACSII表是从[97,122]。
这里也要注意,char参与运算时,也是会升级为int类型,这里我们在前面提过,如果这时我们将结果赋值给char就会无法通过编译,需要进行强转。 就像如图报错,大家要注意这个细节。
当我们给char类型赋值一个超出取值范围的整数时,编译器此时会报错,这时我们需要进行强转。因为int是32位bit,char只有16位,所以char只会取int的后16位,然后转化为对于的字符。
6.float
float是浮点数类型中的单精度,在计算机中占用4个字节,也就是32个bit位,有效的位数为7位,浮点数类型也就是我们的小数类型。通常我们在给float赋值时,因为在其末尾加上f,以告知jvm我们这是float类型,我们直接给一个小数赋值,它会出现下面这种情况。
这是为什么呢?在整数类型中,我们默认的类型为int,而在浮点数类型中我们默认的类型为double。你给float赋值一个double当然会报错,这时就需要你进行强转,这时就会有损失精度的可能性。那为什么可以给float赋值一个int类型的值呢?虽然float虽然和int一样都占4个字节,但浮点数类型是比整数类型更大的,所以我们给float赋值int类型是可以的,它会自动加上小数部分,当给int赋值float时则会报错,需要强转,强转后所有的小数部分都会丢失。
7.double
double是Java中基本数据类型中浮点数类型的默认类型。它占八个字节,和long一样,开销还是比较大的,它是双精度。很多人好奇双精度和单精度有什么区别?其实也就是范围的问题,double有效的位数为16位。浮点数的使用唯一要记住的就是,能尽量使用float就float,因为double实在太占内存,而且运行速度慢于float。double赋值给float需要进行强转,即使有可能输出的值并未改变。
double也是除去boolean类型里最大的数据类型,它可以强转为其余六种数据类型,不过当然会有精度的损失,将这六种数据类型赋值给double它都可以接收。
8.boolean
作为八大基本数据类型最特殊的一种,boolean显得有些格格不入。它只占一个字节,因为它只有两种取值,boolean和false。这里需要提醒大家的是,C语言中可以用0和非0分别代表false和true,但这在Java中是不允许的。boolean类型也不可以接收其他基本数据类型的值,其他的基本类型也不可以强转为Boolean。
3.小剧场解答
答案选B。
产生精度丢失只会出现在强转的情况下,也就是大的数据类型转为小的,在这里只有B选项产生了强转,由float转为int。
到此这篇关于Java基本数据类型族谱与易错点梳理解析的文章就介绍到这了,更多相关Java 基本数据类型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341