数据类型
(1)概括图
如图6-1-1:
<center>图6-1-1</center>
(2)基本数据类型(primitive data type)
a.总结
三大类,八小类,如图6-1-1。
b.数值型
1) 整数类型
计算机存储单位:
位 ,比特,bit,表示一位二进制数,一个0或1,简写为b,是存储数据的最小单位(数据传输大多以比特为单位)
字节,Byte,有8位组成,简写为B。字节是存储数据的基本单位,并且还是硬件所能访问的数据最小单位(因为硬件是通过地址总线访问内存的,而地址是以字节为单位分配的,所以地址总线只能精确到字节。那如何控制到字节的某一位,就要通过“位运算符”,即通过软件的方式来控制)。
1 KB(Kilobyte,千字节)=1024 B
1 MB(Megabyte,兆字节)=1024 KB
1 GB(Gigabyte,吉字节,千兆)=1024 MB
1 TB(Trillionbyte,万亿字节,太字节)=1024 GB
1 PB( Petabyte,千万亿字节,拍字节) = 1024 TB
1 EB( Exabyte,百亿亿字节,艾字节) = 1024 PB
1 ZB (Zettabyte,十万亿亿字节,泽字节) = 1024 EB
1 YB ( Yottabyte,一亿亿亿字节,尧字节) = 1024 ZB
1 BB ( Brontobyte,千亿亿亿字节)=1024 YB
字与字长的概念:
字:在计算机中,一串数码作为一个整体来处理或运算的,称为一个计算机字,简称字。字通常分为若干个字节(每个字节一般是8位)。在存储器中,通常每个单元存储一个字。因此每个字都是可以寻址的。字的长度用位数来表示 。
字长:计算机的每个字所包含的位数称为字长,计算的字长是指它一次可处理的二进制数字的数目。一般地,大型计算机的字长为32-64位,小型计算机为12-32位,而微型计算机为4-16位。字长是衡量计算机性能的一个重要因素 。
整型用于表示没有小数部分的数值,允许为负数。整型的范围与运行Java代码的机器无关,这正是Java程序具有很强移植能力的原因之一。与此相反,C和C 程序需要针对不同的处理器选择最有效的整型。
<center>图6-2-1</center>
整型常量的4种表现形式:
十进制整数,如:100,-100,0
八进制整数,要求以0开头,如:015
十六进制数,要求0x或0X开头,如:0x15
二进制数,要求0b或0B开头,如:0b01110011
Java语言的整型常数默认为int 型,声明long型常量可以后加'l'或‘L’。
2) 浮点数类型
带小数的数据在java中称为浮点型。浮点型数据可分为float类型和double类型。float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。而double表示这种类型的数值约是float类型的两倍,又被称作双精度类型,绝大部分应用程序都是采用double类型。浮点型常量默认类型也是double。
<center>图6-2-2</center>
java浮点类型常量有两种表示形式
十进制数形式,例如:3.14 314.0 0.314
科学记数法形式,如:314e2 314E2 314E-2
- 浮点数特性:不精确
示例
代码语言:javascript复制float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d);//结果为false
示例
代码语言:javascript复制float d1 = 423432423f;
float d2 = d1 1;
if(d1==d2){
System.out.println("d1==d2");//输出结果为d1==d2
}else{
System.out.println("d1!=d2");
}
- 二进制浮点数不能精确的表示0.1、0.01、0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。
- java.math包下面的两个有用的类:BigInteger和BigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。
- float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。
示例:
代码语言:javascript复制float f = 3.14F;
double d1 = 3.14;
double d2 = 3.14D;
- 涉及小数的运算,不要用浮点数,用BigDecimal类
示例
代码语言:javascript复制import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal bd = BigDecimal.valueOf(1.0);
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
System.out.println(bd);//0.5
System.out.println(1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1);//0.5000000000000001
}
}
c.字符型
- 字符型在内存中占2个字节,在Java中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串。
- char 类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字,它占2个字节,可允许有65536个字符。
- Unicode具有从0到65535之间的编码,他们通常用从’u0000’到’uFFFF’之间的十六进制值来表示(前缀为u表示Unicode)
- Java 语言中还允许使用转义字符 ‘’ 来将其后的字符转变为其它的含义。常用的转义字符及其含义和Unicode值如下。
示例:
代码语言:javascript复制 char a = 'T';
char b = '尚';
char c = 'u0061';
System.out.println(c);
//转义字符
System.out.println("" 'a' 'n' 'b');
System.out.println("" 'a' 't' 'b');
System.out.println("" 'a' ''' 'b'); //a'b
//String就是字符序列,以后细说
String d = "abc";
d. 布尔型
- boolean类型有两个常量值,true和false,在内存中占一位(不是一个字节),不可以使用 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。 boolean 类型用来判断逻辑条件,一般用于程序流程控制 。
示例:
代码语言:javascript复制 boolean flag ;
flag = true; //或者flag=false;
if(flag) {
// true分支
} else {
// false分支
}
请不要这样写:if ( flag == true ),只有新手才那么写。关键也很容易写错成if(flag=true),这样就变成赋值flag 为true而不是判断!
(3)引用数据类型(reference data type)
讲对象时补充
(4)自动类型转换
- 自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。如图图6-4-1所示,红色色的实线表示无数据丢失的自动类型转换,而蓝色虚线表示在转换时可能会有精度的损失。
- 可以将整型常量直接赋值给byte、 short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
示例
代码语言:javascript复制short b = 12; //合法short b = 1234567;//非法,1234567超出了short的表数范围
(5)强制类型转换
- 强制类型转换,又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
语法格式:
代码语言:javascript复制(type)var
- 运算符“()”中的type表示将值var想要转换成的目标数据类型。
示例:
代码语言:javascript复制double x = 3.14;
int nx = (int)x; //值为3char c = 'a';
int d = c 1;
System.out.println(nx);
System.out.println(d);
System.out.println((char)d);
- 当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。
示例:
代码语言:javascript复制int x = 300;
byte bx = (byte)x; //值为44
- 不能在布尔类型和任何数值类型之间做强制类型转换
(6)类型转换常见问题
- 操作比较大的数时,要留意是否溢出,尤其是整数操作时。
示例:
代码语言:javascript复制int money = 1000000000; //10亿int years = 20;
//返回的total是负数,超过了int的范围int total = money*years;
System.out.println("total=" total);
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生了数据丢失long total1 = money*years;
System.out.println("total1=" total1);
//返回的total2正确:先将一个因子变成long,整个表达式发生提升。全部用long来计算。long total2 = money*((long)years);
System.out.println("total2=" total2);
- 不要命名名字为l的变量,l容易和1混淆。long类型使用大写L不要用小写。
int l = 2; //分不清是L还是1,
long a = 23451l;//建议使用大写L
System.out.println(l 1);