《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(整型、浮点型、布尔型)

时间:2022-07-25
本文章向大家介绍《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(整型、浮点型、布尔型),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

3.6基本数据类型及字符集编码

  前面我们说过,在Java中,每一个变量都必须归属一种类型。Java一共有8种基本数据类型(primitive type)。其中包括4种整型,2种浮点型,1种字符型和1种布尔型。

3.6.1整型

       整型就是用来表示没有小数的数值。可以是负数。Java提供了4种整型,废话不多说,直接上表:

类型

存储长度

取值范围

默认值

byte

1字节

-128~127(-27~27-1)

0

short

2字节

-32 768~32 767(-215~215-1)

0

int

4字节

-2 147 483 648~2 147 483 647(-231~231-1)

0

long

8字节

-9 223 372 036 854 775 808~9 223 372 036 854 775 807(-263~263-1)

0L

       在Java中,整型的范围与机器无关,不像C和C++那样,需要针对不同的平台机器选择有效的整型。因此Java可以做到跨平台移植。

       实际运用中,用的最多的应该是int型。当然我们在实际应用中,应该需要考虑到一个变量的可能的取值范围,尽可能的选择与之匹配的整型,这样可以节省内存空间。

       对于long型的数值,我们会带上一个后缀L,例如:

long number=400000L;

  这个后缀用小写l也是可以的,但是由于小写l容易和数值1混淆,因此建议都写成大写的L。

     对于列表的默认值,这个的含义是在一个类中定义一个成员变量的时候,可以不初始化,当初始化类的时候,会自动给成员变量赋值为默认值。

       这个表,除了第三列的long型外,其余部分需要牢记于心。

3.6.2浮点型

       浮点型就是用来表示有小数的数值。可以是负数。Java中提供了2种浮点型:

类型

存储长度

取值范围

默认值

float

4字节

大约±3.402 823 47E+38F(有效位数为6~7位)

0.0F

double

8字节

大约±1.797 693 134 862 315 70E+308(有效位数为15位)

0.0D

       float叫做单精度,double叫做双精度。float类型的数值我们会带上后缀F,double类型的数值我们会带上后缀D。

       一般情况下,我们都选择使用double类型。浮点数值的计算遵循IEEE754规范,当溢出和出错的时候,会有三种特殊的浮点数值:

  • 正无穷大
  • 负无穷大
  • NaN(不是一个数字)

例如,8除以0的结果为正无穷大。0/0的结果是NaN。

浮点类型不适合用来参与对精度要求高的计算中,例如金融方面的计算。我们如果打印下面语句:

   System.out.println(2.0 - 1.1);

结果会很意外的是0.8999999999999999,具体原因需要牵涉到浮点数在计算中的表示方法,一两句话说不清楚,只需要牢记就行。在对精度要求高的计算中,我们会采用BigDecimal类来处理,这个后面会介绍。

3.6.3布尔型

       布尔类型就是boolean类型,取值只有2个值:true和false。用来判断逻辑的条件。默认值是false。本来想说明布尔类型的存储长度,结果查阅了很多资料,都没有找到相关说明,很奇怪。先查询了一下官方Java指南:

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

对boolean的定义:

boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.

翻译就是说布尔类型表示一位信息,大小不是精确定义的。然后又查了一下官方Java虚拟机文档:

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.3.4

摘抄如下:

Although the Java Virtual Machine defines a boolean type, it only provides very limited support for it. There are no Java Virtual Machine instructions solely dedicated to operations on boolean values. Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java Virtual Machine int data type. The Java Virtual Machine does directly support boolean arrays. Its newarray instruction (§newarray) enables creation of boolean arrays. Arrays of type boolean are accessed and modified using the byte array instructions baload and bastore (§baload§bastore). In Oracle’s Java Virtual Machine implementation, boolean arrays in the Java programming language are encoded as Java Virtual Machine byte arrays, using 8 bits per boolean element. The Java Virtual Machine encodes boolean array components using 1 to represent true and 0 to represent false. Where Java programming language boolean values are mapped by compilers to values of Java Virtual Machine type int, the compilers must use the same encoding.

翻译大致为:

虽然Java虚拟机定义了布尔型,但它只提供了非常有限的支持。没有专门针对布尔值的操作的Java虚拟机指令。相反,Java编程语言中操作布尔值的表达式被编译为使用Java虚拟机int数据类型的值。 Java虚拟机直接支持布尔数组。它的newarray指令(§newarray)允许创建布尔数组。使用字节数组指令baload和bastore(§baload,§bastore)访问和修改布尔类型的数组。 在Oracle的Java虚拟机实现中,Java编程语言中的布尔数组被编码为Java虚拟机字节数组,每个布尔元素使用8位。 Java虚拟机使用1表示真,0表示假来编码布尔数组组件。如果编译器将Java编程语言布尔值映射为Java虚拟机类型int的值,则编译器必须使用相同的编码。

由以上2段信息,可以得出2个结论:

  1. boolean类型被编译为int类型,等于是说JVM里占用字节和int完全一样,int是4个字节,于是boolean也是4字节
  2. 在Oracle的JVM中,boolean数组被编码为byte数组,每个boolean元素占用1个字节