[Java Basic] 03 基本类型

8种基本类型

Java语言有8种基本数据类型,分别用于存储数值、字符和布尔类型数据.

8种数据类型中,最常用的有5种,分别为intlongdoublecharboolean.其余的数据类型几乎不用,要求对这5种基本数据类型重点掌握.

整数类型

整数类型用来存数整数数值,即没有小数部分的数值.可以是正数,也可以是负数.整型数据在Java程序中有3种表现形式.分别为十进制、八进制和十六进制.

数据类型 内存空间(八位等于1字节) 取值范围
byte 8位 -128 ~ 127
short 16位 -32767 ~ 32767
int 32位 -2147483648 ~ 2147483647
long 64位 -9223372036854775808 ~ 0223372036854775807

在定义以上4种类型变量时,要注意变量的取值范围,超出变量的取值范围就会出错.声明long类型变量需要在数值后面加上L或者l.

 

  • int类型
        int是最常用的整数类型,一个int类型的变量占用4个字节,即32位的内存空间.Int的最大表示范围大约正负21个亿.

1.整数直接量是int类型

所谓整数直接量就是直接写出的整数.

    1. int a = 100; //100为直接量

整数的直接量的类型默认为int类型,如果直接写出的整数超过了int的表达范围,将会出现编译错误.

    1. int d = 10000000000; // 编译错误,Java认为所有直接写出的整数都是int类型.而这个数值超过了int的表达范围.

除了通常的十进制数字形式,整数直接量也可以写成16进制的形式(以0X或0x开头)或8进制的形式(以0开头).

    1. int a = 100000;   // 10进制 
      int b = 0x186a0;  // 16进制 
      int c = 0303240;  // 8进制 

2.整型数据除法运算中的取整

若对两个整数相除,会舍弃小数的部分(注意:不是四舍五入),结果也是整数.

    1. int c = 5/3;
      System.out.println(c);              // c的值为1,取整
      int total = 87;    
      int error = 23;
      int percent = error / total * 100;
      System.out.println(percent+"%");    //结果为0%,23除以87整数部分为0,乘以100,为0
      percent = 100 * error / total;
      System.out.println(percent + "%");  // 结果为26%,230除以87整数部分为26 

3.运算时要防止溢出的发生

当两个整数进行运算时,其结果可能会超过整数的范围而发生溢出,正数过大而产生的溢出,结果为负数;负数过大而产生的溢出,结果为正数.

    1. int a = 2147483647;    //int类型整数的上限
      int b = -2147483648;    //int类型整数的下限
      a = a + 1;
      b = b - 1;
      System.out.println("a=" + a);    //输出结果: a=-2147483648 溢出,结果错误. 
      System.out.println("b=" + b);    //输出结果: b=2147483647  溢出,结果错误. 

 

  • long类型

1.使用long类型进行较大整数的运算

对于较大的整数运算(超过int的表达范围),可以使用long型.

  1. long distance1 = 10000 * 365 * 24 * 60 * 60 * 299792458l;  
    //必须有一个long型数据参与的运算结果才是long型 
    System.out.println("distance1="+distance1);   //distance1=547836957965889536 结果正确
    long distance2 = 10000 * 365 * 24 * 60 * 60 * 299792458; 
    System.out.println("distance2="+ distance2);  //distance2=-1973211136 溢出,=号后面的数据默认为int类型,超出了范围,发生溢出.

浮点数类型

浮点类型表示有小数部分的数字.Java语言中浮点类型分为单精度浮点类型(float)和双精度浮点类型(double).

数据类型 内存空间(8位等于1字节) 取值范围
float 32位 1.4E-45 ~ 3.4028235E38
double 64位 4.9E-324 ~ 1.7976931348623157E308
  • double类型

1.使用double进行浮点数的运算

double类型的精度值是float类型的两倍,因此而得名双精精,在实际的应用开发中,float应用极少,大多数场合使用double表示浮点数.

    1. double pi = 3.14;
      double r = 8;
      double s = pi * r * r;
      System.out.println("s=" + s);   // 输出的结果为:s=200.96

2.double运算时会出现舍入误差

2进制系统中无法精确的表示1/10,就好像十进制系统中无法精确的表示1/3一样,所以,2进制表示10进制会有一些舍入误差,对于一些要求精确运算的场合会导致代码的缺陷.

    1. double money = 3.0; 
      double price = 2.9; 
      System.out.println(money - price);   //输出的结果是: 0.10000000000000009 

字符类型

  • char类型

字符类型char事实上是一个16位无符号整数(都是正数),这个值是对应字符的编码,Java字符类型采用Unicode字符集编码(通用码、统一码、 万国码).

而Unicode是世界通用的定长字符集,所有的字符都是16位来表示.例如:字符a实际的值为97,字符A实际的值为65,字符0实际的值为48.

    1. char c1 = ‘中’;   //c1中存的是”中”的编码 
      char c2 = '\u4e2d';   //‘4e2d’为‘中’所对应的16位Unicode编码的16进制表示形式
      System.out.println(c1);
      System.out.println(c2);

1.对char型变量赋值

方式一:字符直接量:形如‘A’,变量中实际存储的是该字符的Unicode编码(无符号整数值),一个char型变量只能存储一个字符.

    1. char c1 = 'A';  

方式二:整型直接量:范围在0~65535之间的整数,变量中实际存储的即该整数值,但表示的是该整数值所对应的Unicode字符.

    1. char c2 = 65;    

Unicode形式:

    1. char c3 = '\u0041'; 

2.使用转义字符

转义字符是一种特殊的字符变量,它以反斜线"\"开头,后跟一个或多个字符.转义字符具有特定的含义,不同于字符原有的意义,故称为"转义".

转义字符 含义
\ddd 1-3位八进制数据所表示的字符
\dxxxx 4位十六进制所表示的字符
\' 单引号字符串
\\ 反斜杠字符
\t 垂直制表符
\r 回车
\n 换行
\b 退格
\f 换页

布尔类型

boolean类型适用于关系、逻辑运算,表示某个条件是否成立,只允许取值true或false,true表示条件成立,而false表示条件不成立.

boolean型变量经常用于存储关系运算的结果,所谓关系运算就是比较两个变量的大小相等等关系.

  1. int age = 18;
    boolean isChild = age<16;  
    System.out.println(isChild);   // isChild的值为false
    boolean running = true; 
    boolean closed = false; 

基本类型之间的转换

不同的基本类型直接可以相互转化,转为方式分为两种:隐式类型转换和显式类型转换.

  • 隐式类型转换

从低级类型向高级类型的转换,系统将会自动执行.程序员无需进行任何操作.这种类型的转换称为隐式转换.

1.数值运算时的自动转换

如果在一个表达式中出现了多种数据类型,则运算结果会自动的向较大的类型进行转化.

    1. //由于有long型的直接量参与,整个表达式的结果为long 
      long distance = 10000 * 365 * 24 * 60 * 60 * 299792458l;
      
      //由于有double型的直接量599.0参与,整个表达式的结果为 double 
      double change = 800 - 599.0;
          
      //结果为0.0,右边都是int型数据运算结果也为int类型,结果为0,再赋值给double
      型,将0转化为 0.0
      double persent1 = 80 / 100;
          
      //结果为0.8,右边表达式有double型直接量参与, 运算结果为double型
      double persent2 = 80.0 / 100;  

2.byte、char、short转换为int

8种数据类型中,byte、char、short、int、long都表示整数类型,而整型的直接量为int.

int直接量可以直接赋值给byte、char和short,只要不超过其表示范围.

    1. byte   b  = 97;
      short  s  = 97;
      char   c  = 97;

byte、char、short三种类型参与运算时,先一律转换成int类型再进行运算.

    1. byte  b  =  97;
      int  num = b + b;   //num的值为194

 

  • 显式类型转换

当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转换运算(又称强制类型转换).

语法: (类型名)要转换的值

    1. int   a = (int)45.23;  //此时输出a的值为45
      long  y = (long)456.6F //此时输出y的值为456
      int   b = (int)'d';    //此时输出b的值为100

强制转换时的精度丧失和溢出.

    1. int a = 100;
      int b = 200;
      long c = a + b;         //自动将int转化为long
      
      long l1 = 1024l; 
      int i = (int) l1;       //需要加强制转化符由于1024在int的范围内,所以没有产生溢出
      
      long l = 1024L * 1024 * 1024 * 4;
      int j = (int) l;        //会产生溢出
      System.out.println(j);  // 结果为:0
      
      double pi = 3.1415926535897932384;
      float f = (float) pi;   //会造成精度的损失,因为单精度的精确度小于double
      System.out.println(f);  //结果为:3.1415927 

当执行显式类型转换时可以能会导致精度损失.所以进行强制类型转换时要避免.

posted @ 2014-08-24 14:15  cnCoder  阅读(167)  评论(0)    收藏  举报