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,不过我们无法直接对它们进行操作。

 

代码示例:

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);
    }
}
View Code

 

问题:

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

官方:Primitive Data Types

维基: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

 

posted @ 2016-10-21 11:26  桐城东旭  阅读(549)  评论(2编辑  收藏  举报