java语言基础--数据类型:详解char、int、自动类型转换、强制类型转换、精度损失
数据类型--char
一、char
1.1
- char占用2个字节
- char取值范围:【0~65535】
- char采用unicode编码方式
- char类型的字面量用单引号括起来
- 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 = 2147483648L; 40 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=456; 30 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=2147483648L; 48 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=2147483648L; 34 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 = 300; 13 14 //要想以上程序通过,必须加强制类型转换符 15 //虽然编译通过,但可能精度损失 16 //300对应的二进制:00000000 00000000 00000001 00101100 17 byte占用1个字节,砍掉前三个字节:00101100(44) 18 byte b = (byte) 300; 19 System.out.println(b); 20 21 //这个编译能通过吗? 22 //1是int类型,x是byte类型 23 //编译通过 24 byte x = 1; 25 byte y = 127; 26 //编译报错:不兼容类型:从int转换到byte可能会有损失 27 byte z = 128; 28 } 29 }