Java基本数据类型
本文主要深入介绍Java八大基本数据类型。
byte
概要:8位有符号二进制整数;
范围:或者-128 (-2^7) 到 +127 (2^7 -1)
默认值:0
short
概要:16位有符号二进制整数;
范围:-32,768 (-2^15) 到 32,767 (2^15 -1)
默认值:0
int
概要:32位有符号二进制整数;
范围:- 2,147,483,648 (-2^31) 到 2,147,483,647 (2^31 -1)
默认值:0
long
概要:64位有符号二进制整数;
范围:-9,223,372,036,854,775,808(-2^63) 到 9,223,372,036,854,775,807 (2^63 -1)
默认值:0L
float
概要:单精度、32位、符合IEEE 754标准的浮点数;
范围: 1.4E-45 ( 2^-149) 到 3.402,823,5E38 ( (2 - 2^-23) * 2^127 )
默认值:0.0L
double
概要:双精度、64位、符合IEEE 754标准的浮点数;
默认值:0.0d
范围: 4.9 E-324 (2^-1074)到 1.797,693,134,862,315,7 E+308 ( (2 - 2^-52) * 2^1023 )
浮点数不能用来表示精确的值,如货币;
boolean
概要:表示一位的信息,只有两个取值:true和false;
默认值:false
char
概要:一个单一的16位Unicode字符;
最小值是’\u0000’(即为0);
最大值是’\uffff’(即为65,535);
默认值:'\u0000'
浮点数详解:
存储结构图解
表示方法 s · m · 2(e - N + 1)
s is +1 or -1, m is a positive integer less than 2N, and e is an integer between Emin = -(2K-1-2) and Emax = 2K-1-1
24+8=32位,
53+11=64位。
举例:
这段话翻译过来的大意是,
0.15625 转换成 二进制 0.00101, 即 1.012 × 2-3 (二进制的1.01乘以指数2-3), float 类型的偏差为 127;对于 double 类型的偏差为 1023,
所以偏移码是127+ -3 = 124,存储为二进制就是之前看到的存储结构图中的阶码显示的 01111100,
尾数位就是 .01000...2
注:
Float和Double的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14 × 103 =3140,3.14E-3 就是 3.14 x 10-3 =0.00314。
实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。
代码示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package datatypes; /** * Name: Datatype * Description: * * @author sunil * @date 2016/10/21 11:39 */ public class Datatype { public static void main(String[] args) { // byte System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE); System.out.println("包装类:java.lang.Byte"); System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE); System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE); System.out.println(); // short System.out.println("基本类型:short 二进制位数:" + Short.SIZE); System.out.println("包装类:java.lang.Short"); System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE); System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE); System.out.println(); // int System.out.println("基本类型:int 二进制位数:" + Integer.SIZE); System.out.println("包装类:java.lang.Integer"); System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE); System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE); System.out.println(); // long System.out.println("基本类型:long 二进制位数:" + Long.SIZE); System.out.println("包装类:java.lang.Long"); System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE); System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE); System.out.println(); // float System.out.println("基本类型:float 二进制位数:" + Float.SIZE); System.out.println("包装类:java.lang.Float"); System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE); System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE); System.out.println(); // double System.out.println("基本类型:double 二进制位数:" + Double.SIZE); System.out.println("包装类:java.lang.Double"); System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE); System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE); System.out.println(); // char System.out.println("基本类型:char 二进制位数:" + Character.SIZE); System.out.println("包装类:java.lang.Character"); // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台 System.out.println("最小值:Character.MIN_VALUE=" + (int) Character.MIN_VALUE); // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台 System.out.println("最大值:Character.MAX_VALUE=" + (int) Character.MAX_VALUE); } }
问题:
1,那么为什么long转换成float和double可能会丢失精度?
以前一直误以为浮点数就是简单的按照数字顺序来存储的,在了解完浮点数的存储结构后,才知道这个误解实在够深。
言归正传,
long,范围:-9,223,372,036,854,775,808(-2^63) 到 9,223,372,036,854,775,807 (2^63 -1)
float, 范围: 1.4E-45 ( 2^-149) 到 3.402,823,5E38 ( (2 - 2^-23) * 2^127 )
double, 范围: 4.9 E-324 (2^-1074)到 1.797,693,134,862,315,7 E+308 ( (2 - 2^-52) * 2^1023 )
乍一看,浮点数明显取值范围比long要大。
其实道理很简单,因为尾数部分24(53),放不下有较多有效位数的long整数转换后的尾数位。
package datatypes; /** * Name: Long2Precision * Description: * * @author sunil * @date 2016/10/21 18:32 */ public class Long2Precision { public static void main(String[] args) { long l = 2000000001; System.err.println("l: " + l); float f = Long.valueOf(l).floatValue(); System.err.println("l2f: " + f); long nl = Float.valueOf(f).longValue(); System.err.println("f2l: " + nl); System.err.println("lost precision: " + (l - nl)); } }
输出结果:
l: 2000000001 l2f: 2.0E9 f2l: 2000000000 lost precision: 1
2,为什么不建议用浮点数表示精确的值?
道理和上面是一样的。
char详解:
Unicode统一码,char是其中的一种,即UTF-16 (16-bit Unicode Transformation Format)。
采用的是16进制表示,
U+0000 to U+D7FF 和 U+E000 to U+FFFF 区间中的每一个码都有对应的数字
各种码比较:
代码示例:
package com; /** * Created by henry on 10/22/16. */ public class Unicode { public static void main(String[] args) { System.err.println('\u0041'); System.err.println('\u0042'); System.err.println('\u0043'); System.err.println('\u0044'); System.err.println('\u0045'); System.err.println('\u0046'); System.err.println('\u0047'); System.err.println('\u0048'); System.err.println('\u0049'); System.err.println('\u004A'); System.err.println('\u004B'); System.err.println('\u004C'); System.err.println('\u004D'); System.err.println('\u004E'); System.err.println('\u004F'); } }
打印结果为A到O.
http://www.unicode.org/
https://en.wikipedia.org/wiki/UTF-16
http://www.fileformat.info/info/charset/UTF-16/list.htm
http://unicode-table.com/en/#control-character
https://en.wikipedia.org/wiki/Plane_(Unicode)
https://en.wikibooks.org/wiki/Unicode/Character_reference
参考文档:
IEEE 754标准: https://people.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF
维基:https://en.wikipedia.org/wiki/IEEE_754-1985#Representation_of_numbers
规范:https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3
https://en.wikibooks.org/wiki/Java_Programming/Primitive_Types
http://www.runoob.com/java/java-basic-datatypes.html
https://www.tutorialspoint.com/java/java_basic_datatypes.htm