说说Java基本数据类型

对于Java来说,数据类型大致分为两类,分别为:基本数据类型和引用数据类型。至于引用数据类型,由于涉及的方面较广,留待以后慢慢介绍,本篇只介绍基本数据类型。

说到基本数据类型,其分类大致分为三种:数值类型、字符类型和布尔类型。当然,偶尔也会将字符类型囊括到数值类型当中,因为,字符类型在内存是以Unicode编码值存在的,所以从这一点来看,说字符类型是数值类型也不无道理。当然,本篇采用的观点是分为三类。

数值类型

数值类型是用来表示数字的,又可以分为两类,分别为:整数类型和浮点数类型。

  • 整数类型

对于整数类型来说,又可以分为四类,分别为:byte、short、int和long。它们的区别在于在内存所占的位数和表示范围的值。

byte: 占8位,可表示-128(-2的7次方)~127(2的7次方减一)。

short: 占16位,可表示-32768(-2的15次方)~32767(2的15次方减一)。

int: 占32位,可表示-2147483648(-2的31次方)~2147483647(2的31次方减一)。

long: 占64位,可表示-2的63次方~2的63次方减一。

我想大家肯定有所疑惑,为啥所占位数为n, 可表示范围确实-2的n-1次方到2的n-1次方减一。因为,数值在计算机中是以补码的形式存在,最高位为符号位,所以一个数占n位的情况下,只有n-1位可以用来表示数值。之所以正整数会比2的n-1次方少1,那是因为n-1位全为1的情况值为2的n-1次方减1。

至于补码及相关知识,可以参考我的另一篇文章:聊聊原码、反码和补码那些事

在Java中,不论声明类型是什么,整数默认都是int类型。下面我将给出例子证明一下,以byte类型的表示为例,示例代码如下图所示:

说说Java基本数据类型

首先byte最大表示范围在-128~127范围内,当所给整数在此范围内时,虽然默认为int类型,但编译器会进行自动类型转换,将int类型的整数自动转为为byte类型,但如果超出了byte的表示范围,则无法进行自动类型转换,从而发生错误。

short类型与byte类型一致。

对于long类型来说,表示范围比int类型大,因此任何整数类型都能赋值给long类型。如果一个数值类型超出了int类型的表示范围,那么直接给long类型进行赋值时会发生错误,所以需要在整数后面加L或l后缀,表明该整数为long类型,若不加,该整数依然默认为int类型。示例代码如下图所示:

说说Java基本数据类型

对于整数类型来说,可以存在四种表示方式,分别为:二进制、八进制、十进制和十六进制。在计算机中的整数都是以二进制的形式存在,十进制为我们生活中常用的表示方式,至于八进制和十六进制会在特定场景下使用。

对于Java来说,二进制整数表示方式是Java7才有,需在前面加0b或0B,八进制整数需在前面加0,十进制表示方式则无任何前缀,十六进制整数是在前面加0x或0X。

关于整数的四种表示方式的示例如下图所示:

说说Java基本数据类型

执行结果如下图所示:

说说Java基本数据类型

  • 浮点类型

所谓浮点类型的数就是我们日常所见的小数。浮点数分为两种类型,分别为:float类型和double类型。在Java中,浮点数默认为double类型,如需使用float类型,则需要在后面加F或f,通常加F。

其中,float类型也叫单精度浮点数,占4个字节,共32位,而double类型也叫双精度浮点数,占8个字节,共64位。需要说明一点的是,浮点数用的是科学计数法,因此其表示的数只是一个近似值。如果需要精确的小数,可以考虑:java.util.BigDecimal类。

对于浮点数来说,其有着固定的表数范围和字段长度,其中,float类型的首位为符号位,之后的8位表示指数,23位表示尾数。而double类型的首位为符号位,之后的11位表示指数,之后的52位表示尾数。

浮点数的表示方式只有两种,分别是:十进制表示法和科学计数法。下面给出两种表示方式的例子。

说说Java基本数据类型

执行结果如下图所示:

说说Java基本数据类型

需要说明的是,科学计数法中的e可以理解为10的几次方。如e2即10的2次方。还有一点需要强调的是,只有浮点数才可以使用科学计数法,如:12E2是一个浮点数,而1200则是一个int类型的整数。

浮点数中提供了三个特殊的浮点值,分别为:正无穷大、负无穷大和非数。任意的正浮点数除以0得到正无穷大,任意的负浮点数除以0得到负无穷大,0.0除以0得到非数。在float对应的包装类Float和double对象的包装类Double中,用POSITIVE_INFINITY表示正无穷大,用NEGATIVE_INFINITY表示负无穷大,用NaN表示非数。其中,定义的代码如下图所示:

说说Java基本数据类型

Float中关于正负无穷大和非数的定义

说说Java基本数据类型

Double中关于正负无穷大和非数的定义

需要强调的是,所有的正无穷大都相等,所有的负无穷大都相等,而所有的非数都不相等,包括NaN和自身都不相等。证明的例子如下图所示:

说说Java基本数据类型

执行结果如下图所示:

说说Java基本数据类型

字符类型

字符类型是用单引号(')包括起来的字符。在Java中的字符占16位,2个字节,使用的是Unicode编码,可以支持ASCII字符及各个国家的字符,被称为万国码。

对于Java中的字符来说有三种表示方式:

  1. 直接使用单引号进行包括,如:'a','b'等。
  2. 使用转义字符,如:'\t'、'\n'、‘\b’等。
  3. 使用Unicode编码,类似\uXXXX的形式。中文字符的范围是\u4e00到\u9fa5。

字符三种表示方式的示例代码如下图所示:

说说Java基本数据类型

执行结果如下图所示:

说说Java基本数据类型

对于Unicode字符编码来说,其表示范围是从\u0000到\uFFFF,总共可以表示65535个字符。其中前255个(\u000-\u00FF)与ASCII的编码重合。

正因为计算机中保存的字符都是以其对应的编号进行存储,因此char类型的值可以当做整型值来进行算术运算,相当于一个16位的无符号整数,取值范围为:0-65535。

关于字符的进行算术运算的示例如下图所示:

说说Java基本数据类型

执行结果如下图所示:

说说Java基本数据类型

至于上述例子为何会使用强制类型转换,那是因为表达式提升所导致。关于表达式类型提升等以后有功夫在详细介绍。

最后需要强调一点,只要是在JVM中的字符编码,都是Unicode编码,也就是所谓的\uXXXX,都是整数,但如果是别的平台, 如操作系统或浏览器中的编码才会有GBK或UTF-8之类的划分。

布尔类型

布尔类型只有一种,那就是boolean。而它的值也只有两个,分别是:true和false。如果我没记错的话,C或C++的布尔类型的值还可以用0或1来表示,但是在java中是不允许的。

布尔类型常用来作为条件判断,从而控制循环或分支。当然,三目表达式中也会用到布尔类型。

由于布尔类型比较简单,所以这里只上一个小例子。

说说Java基本数据类型

自此,关于Java中基本数据类型的介绍便算完毕,希望大家都能掌握。


分享到:


相關文章: