java基础数据及类型转换

基础数据类型总结:java

1、八中基础数据类型占用字节编码

类型spa

占用字节code

取值范围orm

默认值xml

封装类blog

boolean内存

1位(不是一个字节)ci

true/falseit

false

Boolean

char

2

0~65535

\u0000

Character

byte

1

-128 ~ 127

0

Byte

short

2

-32768 ~ 32767

0

Short

int

4

+-21亿左右

0

Integer

long

8

+-263次方

0L

Long

float

4

+-10+-38次方

0.0f

Float

double

8

+-10+-308次方

0.0d

Double

 

2、进一步解析:

一、boolean类型不能跟其余类型进行转换;

二、 char类型用来表示Unicode编码表中的字符,参与运算时能够当成整数来用;

举例:

char a = 'a';

int d = a + 3;

System.out.println(d); //输出值为:100

若是要将a+3的值变为字母,能够这么作:

   System.out.println((char)d);

三、整数型的值默认类型为int,但:

byte b = 1; //表达式正确

short s = 2; //表达式正确

byte b2 = 200;//错误,200超过了byte的取值范围;

short s2 = 70000; //错误,70000超过了short的取值范围;

解释:整数类型数值默认为int,但在没有超过所赋值的变量的取值范围时,能够正常赋值,超过所赋值的变量的取值范围则报错;

四、若是整形数值大于int的最大取值范围,则数据值加 L

int i1 = 2200000000//错误,超过了int的取值范围

int i2 = 2200000000L//错误,Long类型超过了int范围

long i3 = 2200000000L//正确

五、浮点型默认为double,小数据类型必须加 f;(double取值范围> float

//如下表达式均正确,由于:精度高的不能赋给精度低的,精度低的能够赋给精度高的

//因此double d8=1.0f是能够的,double d2=1也是能够的

//至于double d5=1D,能够理解为变量d5的值是1 D是双精度数的后缀,而后再将值赋给d5

double d1 = 1; //正确,默认为intint自动转换为double

double d2 =1.0;

double d3 = 1d;

double d4 = 1.0d;

double d5 = 1D;

double d6 = 1.0D;

double d7 = 1.0f;

double d8 = 1.0F;

 

float f1 = 1;//正确,默认为intint自动转换为float

float f2 = 1.0;//错误,默认为double

float f3 = 1f;

float f4 = 1.0f;

float f5 = 1F;

float f6 = 1.0F;

float f7 = 3L;//正确,由于long类型容量没有float

 

3、基本数据类型转换:从容量小的类型到容量大的类型的转换为自动类型转换,把容量大的数据类转赋值给容量小的数据类须要强制类型转换 (是容量,即取值范围,不是字节占用大小):()byteshortchar->int->long->float->double() 

 

解读:

一、byte类型数据能够自动转换成short类型;short类型数据和char类型数据之间相互转换只能强制类型转换,由于它们虽然内存占用相同可是表数范围不同(short-32768~ 32767char0~65535)。

 

 

二、参与计算的时候,byteshortchar之间计算不会互相转换,而是转换成int再计算,即便是同类型间计算也会先转换成int再计算,计算后赋值给byteshortchar须要强制类型转换(我理解由于这时是将一个int变量赋值给byteshortchar,因不知道具体指是多少因此java会认为可能会溢出,因此须要强转)。举例:

byte b1 = 1;

      short s1 = 2;

      char c1 = 'c';

      int sum = b1+ s1 + c1;

      System.out.println("sum:" + sum);// sum:102

      byte sum2 = sum;//表达式错误,须要强制转型

三、有多种类型的数据混合运算时,系统首先自动的将全部数据转换成容量最大的那一种数据类型,而后再进行计算。

      //多种类型混合运算

      char cc1 = 'a';

      byte bb1 = 1;

      short ss1 = 2;

      int ii1 = 3;

      long ll1 = 4;

      float ff1 = 5f;

      double dd1 = 6;

      double summ3 = cc1 + bb1 + ss1 + ii1 + ll1 + ff1 + dd1;//summ3必须声明为double,不然报错

    System.out.println("summ3" +summ3);// summ3118.0

 

四、float f7 = 3L;//正确

解释:由于long类型取值范围容量没有float

System.out.println(Long.SIZE); 

System.out.println(Long.MAX_VALUE); 

System.out.println(Float.SIZE); 

System.out.println(Float.MAX_VALUE);

输出:

64

9223372036854775807

32

3.4028235E38

显然,long的容量没有float的大

五、类型转换,可能会形成精度下降或溢出。

举例:

精度下降:

举例:

  int a = 3;

  double b = 0.03;

  double c = 0.03;

  double d = a+b+c;

  System.out.println("d:" + d);//输出:d:3.0599999999999996

解决:使用java.math包中的BigDecima类并用String来构造,不想举例了,手都写痛了,各位看官本身去度娘搜吧。

 

溢出:

例子1

int money=1000000000;   //10亿 

int year=20; 

int total=money*year; 

System.out.println(total);// 输出结果:-1474836480

 

错误写法

int total=money*year//超过int范围

long total=money*year; //由于moneyyear都是int型,因此他俩的乘积也是int型,超出int型就会出现溢出

long total=(long)(money*year);//道理同上

正确写法

long total=(long)money*year;//由于long类型乘以int类型仍然是long类型;

 

例子2

//一我的70年心跳多少次,输出结果:-2087447296

long times=70*60*24*365*60; 

System.out.println(times);

解决:在这条语句long times=70*60*24*365*60;的第一个数字后面加L,这样的话防止前面的相乘结果已溢出如:long times=70L*60*24*365*60;

 

 

(全文完)