java语言基础--数据类型:详解char、int、自动类型转换、强制类型转换、精度损失

数据类型--char

一、char

1.1

  1. char占用2个字节
  2. char取值范围:【0~65535】
  3. char采用unicode编码方式
  4. char类型的字面量用单引号括起来
  5. char可以存储一个汉字
 1 public class Test{
 2     
 3       public static void main(String[] args){
 4    
 5        //定义一个char类型的变量,起名c,同时赋值字符‘a’
 6         char c1 = 'a';
 7         System.out.println(c);//结果为:a
 8  
 9         //一个中文字符占用2个字节,char类型刚好是2个字节
10        //所以java中的char类型可以存储一个中文字符
11         char c2 ='果';
12         System.out.println(c2);//结果为:果
13 
14         //如果加上单引号0就不是数字0了
15          char c3 = '0';
16           System.out.println(c3);
17 
18         //编译报错:类型不兼容
19         char c4 = "a";
20         System.out.println(c4);
21 
22         //错误:未结束的字符文字
23          char  c5 = 'ab';
24          System.out.println(c5);
25  
26      }
27  }
 

1.2 数据类型-- 转义字符 ‘\’

   \t  表示"制表符tab"

 1 public  class Test{
 2     public static void main(Stirng[]  args){
 3   
 4     //普通的n字符
 5     char  c1 = 'n';
 6     System.out.println(c1);//结果为:n
 7 
 8     //经过编译,发现编译通过,这说明以下并不是一个字符串,而是一个字符
 9     //这是一个“换行符”,属于char类型的数据
10      //反斜杠在java语言中具有转义功能
11      char  c2 = '\n';
12     
13      System.out.print("A");
14      System.out.print(c2);
15      System.out.println("B");
16      输出结果:
17      A
18      B
19 
20 
21 
22      //制表符\t(tab)
23       //强调:制表符和空格不同,它们的ASCII码不同,体现在键盘上两个不同的“按键”
24      char y = '\t';
25      System.out.print("A");
26      System.out.print(y);
27      System.out.println("B");
28      输出结果:
29      A        B
30 
31        //假设现在想在控制台上输出一个‘ ' ’字符怎么办
//错误:空字符文字
//System.out.println(' ' ');
//修改错误,(\'联合起来表示一个普通的‘)
System.out.println('\'');
32 33 //要求控制台上输出“反斜杠字符” 34 //反斜杠将后面的单引号转义成不具备特殊含义的普通单引号字符 35 //左边的单引号缺少了结束的单引号字符,编译报错 36 /* 37 char k = '\'; 38 System.out.println(k); //编译报错 39 */ 40 41 //第一个\具有转义功能,将后面的反斜杠转译为普通的反斜杠字符 42 //结论:java当中两个反斜杠代表一个普通的反斜杠字符 43 char k = '\\'; 44 System.out.println(k); 45 46 //输出"HelloWorld!" 47 //System.out.println("\"HelloWorld!\""); 48 49 } 50 }
 1 public class  CharTest{
 2   public static void main(String[] args){
 3       //双引号括起来的是字符串
 4       System.out.println("test");
 5       //希望输出的结果是:“test”
 6       //错误:需要')'
 7       //System.out.println(""test"");
 8      //修改
 9       System.out.println("\"test\"");
10       System.out.println("“test”");//内部用中文双引号“”是可以的
11 
12      //编译报错:4e2d是字符串
13      //错误:未结束的字符文字
14      char  x = '4e2d';
15 
16       //反斜杠u表示后面的是一个字符的unicode编码
17       //uncode编码是16进制的
18       char x = '\u4e2d';
19        System.out.println(x);//'中'
20 }
21 }

 

 

二、数据类型--整数型int

1、java语言当中的“整数型字面值”被默认当作int类型来处理,要让这个“整数型字面值”被当作long类型来处理的话,需要在“整数型字面值”后面添加1/L,建议使用大写L

2、java语言当中的整数型字面值有三种表示方式:

十进制【是一种缺省默认的方式】

int  a=10;

System.out.println(a);//10

八进制【在编写八进制整数型字面值的时候需要以0开始】

int b=010;

System.out.println(b);//8

十六进制【在编写十六进制整数型字面值的时候需要以0x开始】

int c=0x10;

System.out.println(c);//16

二进制【JDK8新特性,低版本不支持】

int d = 0b10;

System.out.println(d);//2

 

自动类型转换:

 1 /*
 2   在jiava中重要结论:
 3   在任何情况下,整数型的“字面量/数据”默认被当作int类型处理。(记住)
 4    如果希望该“整数型字面量”被当作long类型处理,需要在“字面量”后面加L/l
 5    建议使用大写L
 6 */
 7 
 8 public class IntTest{
 9   public static void main(String[] args){
10       //分析这个代码存在类型转换吗,以下代码什么意思?
11       //不存在类型转换
12       //100这个字面量被当作int类型处理
13       //a变量是int类型
14       //int类型的字面量赋值给int类型的变量
15         int a = 100;
16        System.out.println(a);
17 
18 
19        //分析这个程序是否存在类型转换
20        //小容量可以自动转换成大容量,这种操作被称为:自动类型转换
21        long b = 200;
22        System.out.println(b);
23 
24       
25        //分析这个存在类型转换?
26        //300L是一个long类型的字面量
27        //long类型赋值给long类型,不存在类型转换
28        long c = 300L;
29 
30         //题目
31         long d = 2147483647;//不存在类型转换
32         System.out.println(d);
33          //在java中,整数型字面量编译器直接将其看成int类型
34          //2147483648超出int范围,没赋值前出错
35          //编译报错:整数太大
36         long e = 2147483648;
37 
38          //解决问题:
39          long e = 2147483648L40           System.out.println(e);
41   }
42 }

 

 1 public class Test{
 2 
 3         public static void main(Stirng[] args){
 4 
 5         int  a=10;
 6         int  b=010;//整数型字面值以0开头,后面那一串数字就是八进制形式
 7         int  c=0x10;//整数型字面值以0x开头,后面那一串数字就是十六进制形式
 8  
 9         System.out.println(a); //10
10         System.out.println(b); //8
11         System.out.println(c); //16
12         System.out.println(a+b+c); //34
13 
14 
15 
16         //123这个整数型字面值是int类型
17         //i变量声明的时候也是int类型
18         //int类型的123赋值给int类型的变量i,不存在类型转换
19         int i=123;
20         System.out.println(i);
21 
22         //456整数型字面值被当作int类型,占用4个字节
23         //x变量被声明的时候是long类型,占用8个字节
24         //int类型的字面值456赋值给long类型的x,存在类型转换
25         //int类型转换成long类型
26         //int类型是小容量
27         //long类型是大容量
28         //小容量可以自动转换成大容量,称为自动类型转换机制
29         long  x=45630         System.out.println(x);
31 
32 
33         //2147483647是int类型,占用4个字节
34         //y是long类型占用8个字节,自动类型转换
35          long  y=2147483647;
36          System.out.println(y);
37 
38          //编译错误:过大整数:2147483648
39          //2147483648被当作int类型4个字节处理,但是这个字面值超出int类型范围
40         // long   z=2147483648;
41        //  System.out.println(z);
42          
43          //解决错误
44          //2147483648字面值一上来就当作long类型来处理,在字面值后面添加L
45          //2147483648L是8个字节的long类型
46          //z是long类型变量,以下程序不存在类型转换
47          long   z=2147483648L48          System.out.println(z);      
49         }
50 }
强制类型转换
/*
1、小容量可以直接赋值给大容量,称为自动类型转换
2、大容量不可以直接转换成小容量,需要使用强制类型转换符进行强转。
注意:加强制类型转换符之后,虽然编译通过,但是运行的时候可能会损失精度。
*/
1
public class Test{ 2 3 public static void main(Stirng[] args){ 4 5 //100L是long类型字面值 6 //x是long类型变量 7 //不存在类型转换,直接赋值 8 long x=100L 9 10 //x变量是long类型,8个字节 11 //y变量是int类型,4个字节 12 //以下程序可以编译通过吗 13 //编译报错:不兼容类型:从long转换到int可能会有损失(大容量不可以直接赋值给小容量) 14 int y=x; 15 16 //大容量转换成小容量,需要进行强制类型转换 17 //强制类型转换需要加“强制类型转换符” 18 //加上强制类型转换符之后编译通过了,但是运行阶段可能损失精度 19 //所以强制类型转换谨慎使用,因为损失精度之后可能损失严重 20 //强制类型转换原理: 21 //原始数据:00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100 22 //强制转换后的数据:00000000 00000000 00000000 01100100 23 //将左边的4个字节砍掉【所有数据强转的时候都是这样完成的】 24 int y=(int)x; 25 System.out.println(y); 26 27 28 //原始数据:00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000 29 //强制转换后的数据:10000000 00000000 00000000 00000000 30 //10000000 00000000 00000000 00000000目前存储在计算机内部,计算机存储数据都是采用补码的形式存储 31 //所以以上为补码形式 32 //将以上补码转换为原码就是最终结果 33 long k=2147483648L34 int e=(int)k; 35 System.out.println(e);//损失精度严重,结果是负数【-2147483648】 36 37 38 39 40 } 41 }

 

精度损失:

 1 /*
 2   java中有一个语法规则:
 3       当这个整数型字面量没有超出byte的取值范围,那么这个整数型字面量 
 4       可以直接赋值给byte类型的变量。short类型也可。
 5    这种语法机制是为了方便写代码而存在的
 6 */
 7 
 8 public class IntTest{
 9   public static void main(String[] args){
10          //分析以下代码编译可以通过吗
11         //错误:不兼容类型:从int转换到byte可能会损失
12          byte b = 30013 
14         //要想以上程序通过,必须加强制类型转换符
15         //虽然编译通过,但可能精度损失
16         //300对应的二进制:00000000 00000000 00000001 00101100
17         byte占用1个字节,砍掉前三个字节:00101100(4418         byte b = (byte) 30019         System.out.println(b);
20 
21          //这个编译能通过吗?
22          //1是int类型,x是byte类型
23          //编译通过
24          byte x = 125          byte y = 127;
26          //编译报错:不兼容类型:从int转换到byte可能会有损失
27           byte z = 128;
28   }
29 }

 

posted @ 2021-04-08 22:40  lraj  阅读(675)  评论(0编辑  收藏  举报