在Java中,有两大数据类型——基本数据类型和引用数据类型,本文章介绍基本数据类型。
基本数据类型(Primitive type)分为四类八种,分别是
- 整型(byte、short、int、long)
- 浮点型(float、double)
- 布尔型(boolean)
- 字符型(char)
一、整型(byte、short、int、long)
1.1 整型概览
整型用于表示整数,包括正整数、0和负整数。整型分为四种:byte、short、int、long ,如下表所示:
名称 | 关键字 | 占用字节数 | 范围 | 备注 |
---|---|---|---|---|
字节型 | byte | 1 | -128~127 | 无 |
短整型 | short | 2 | -32768~32767 | 无 |
整型 | int | 4 | -2147483648~2147483647(约±21亿) | 最常用 |
长整型 | long | 8 | 约±922亿亿 | 后缀“L”或“l” |
1.2 整型数据字面量的表示方法
在Java中,整型字面量有四种表示方法:十六进制、十进制、八进制、二进制
1)十六进制表示法:加前缀“0x”或者“0X”,例如:
int a = 0xFF; //转换为十进制表示 255
int b = 0XCAFE; //转换为十进制表示 51996
2)十进制表示法:不加任何前缀,例如:
int a = 100;
long b = 9000000000000000000L; //九百亿亿
3)八进制表示法:加前缀“0”,例如:
int a = 010; //转换为十进制表示8
int b = 077; //转换为十进制表示63
4)二进制表示法:加前缀“0b”或者“0B”(从Java7开始支持),例如:
byte b = 0b01001011; //转换为十进制表示75
short s = 0B1101000100100011; //转换为十进制表示53539
在四种表示方法中,最常用的是十进制表示法。
另外,从Java7开始,还支持为字面量添加下划线“_”进行分隔以便于阅读,编译器会自动忽略这些下划线,例如下面的表示方法是合法的:
int i = 1_000_000; //一百万
long l = 922_00000000_00000000L; //922亿亿
short s = 0B0110_0001_1110_1101;
1.3 关于整型的几点说明
(1)编译器会自动将整型数据的字面量视为int类型,在定义整型变量时,要注意这一点。
int a = 100; //100视为int类型,将其赋给变量a,因为a也是int类型,故不存在自动类型转换
byte b1 = 100; //100视为int类型,因为其未超出byte的取值范围,所以不会报错
byte b2 = 128; //报错【错误: 不兼容的类型: 从int转换到byte可能会有损失】,因为128已超出byte的取值范围(-128~127)
long l1 = 2020; //2020视为int类型,变量l1为long类型,故会自动将2020转换为long类型,再将其赋给l1
long l2 = 2147483648; //这里要注意,虽然2147482648在long的取值范围内,但这里会将其视为int类型,而int类型的最大值为2147483647,所以编译会报错
//下面是上面一句的两种正确写法
long l3 = 2147483648L; //加后缀“L”(不建议写为小写的“l”,因为可能和数字“1”混淆)
long l4 = (long)2147483648; //强制类型转换
(2)byte、short、char这三种类型在做运算的时候,各自会先自动转换为int类型,这称为自动类型转换,例如:
byte b = 10;
char c = 'a';
short s = 20;
short s1 = b + c + s; //报错【错误: 不兼容的类型: 从int转换到short可能会有损失】,应该改为下面的写法:
int s1 = b + c + s; //这样写没问题
(3)与C/C++相比,在Java中没有“无符号数(unsigned)”的说法,即没有 unsigned int、unsigned long等等说法,Java中所有整型均有正负数之分。
二、字符型(char)
2.1 字符型概览
字符型数据用于表示单个字符,在Java中,char类型描述了UTF-16中的一个代码单元,占用2字节,转换为整数值范围为0~65535。
2.2 char类型的字面量的表示方法
(1)使用单引号,例如
char c1 = 'a';
char c2 = '呵'; //汉字亦可
char c2 = '\u4e2d'; //表示中文字符“中”,0x4e2d为“中”的Unicode编码
char c3 = '\n'; //转义字符,表示换行
(2)使用0~65535之间的整数,这里整数可以用前述的四种表示方法(二、八、十、十六进制)表示,例如:
char c1 = 0x003f; //表示英文问号“?”
char c2 = 0X56FD; //表示中文字符“国”
char c3 = 25105; //表示中文字符“我”,十六进制为0x6211
char c4 = 0b0100_1111_0110_0000; //表示中文字符“你”
2.3 Java中的转义字符
\n | 换行 |
---|---|
\t | 制表符 |
\b | 退格 |
\ | 反斜杠 \ |
\’ | 单引号’ |
\" | 双引号" |
\r | 回车 |
转义字符还有一种特殊的用法,“\uXXXX”表示Unicode编码,其中XXXX为0x0000~0xFFFF之间的一个十六进制数。
2.4 char的运算
char变量之间进行二元运算时,实际上是其对应的数值的运算,例如用十进制表示’a’和’c’分别是97和99,那么:
char c1 = 'a'; // 值为97,即0x0061
char c2 = 'c'; //值为99,即0x0063
char c3 = c1 + c2; //c3为97 + 99 = 196,即0x0061 + 0x0063 = 0x00C4,表示字符“Ä”
三、浮点型(float、double)
3.1 概览
浮点型有单精度浮点型(float)和双精度浮点型(double)两种。
名称 | 关键字 | 占用字节数 | 范围 | 有效位数 | 备注 |
---|---|---|---|---|---|
单精度 | float | 4 | 约±3.4E+38 | 6~7位 | 少用,须加后缀F或f |
双精度 | double | 8 | 约1.797E+308 | 15位 | 可选后缀D或d |
3.2 关于浮点型的说明
(1)定义浮点型变量时,字面量被默认为double处理,所以在定义float类型的变量时,要么在字面量后面加F或者f后缀,要么使用强制类型转换。例如:
float f1 = 3.14159; //报错【错误: 不兼容的类型: 从double转换到float可能会有损失】
//下面是正确的方法
float f2 = 3.14159F; //加后缀“F”
//或者
float f3 = (float)3.14159; //使用强制类型转换
(2)注意,float 和 int 虽然都占四个字节,但是 float 的取值范围远大于 int 的取值范围,double 和 long 同理。
四、布尔型(boolean)
4.1 布尔型概览
布尔型只有两个取值:true 和 false。常用于条件语句中作为条件。注意,在C/C++中,所有非零的数值都可以表示“真”,只有0才可以表示“假”,而在Java中不是如此。
4.2 应用举例
int a = 10;
int b = 20;
boolean flag = (a < b);
if (flag){
System.out.println("a is smaller than b");
}else{
System.out.println("a is bigger than b");
} //输出结果为“a is smaller than b”
五、数据类型转换
基本类型的数据类型转换有两种——自动类型转换和强制类型转换
5.1 自动类型转换
自动类型转换即由系统自动地进行转换,通常是由小容量的类型转换为大容量的类型,下图表示了自动类型转换,其中,实线箭头表示没有精度损失的转换,虚线箭头表示可能存在精度损失的转换。
自动类型转换常常发生在以下情形:
(1)定义变量时将小容量的字面量/变量赋值给大容量的变量,例如
byte b = 20; //b 为 byte 类型,容量小于 int 类型
int i = b; //b先转换为 int 类型,再赋值给 i
long l = 2020; //字面值 2020 为 int 类型,这里会先转换为 long 类型再赋值给 l
(2)多个不同类型的值进行算术运算时,会先将各个值自动转换为与其中的最高容量的类型一致,再进行算术运算。例如:
byte b = 20;
int i = 2000;
float f = 10.2;
double d = 20.2;
double sum = b + i + f + d;
System.out.println(sum); //输出结果为2050.399951171875,而不是2050.4,因为将f转换为double类型存在精度损失(?)
但要注意 byte、char 和 short 这三种类型进行算术运算时,均会统一转换为 int 类型再进行算术运算,而不是转换为 short 类型再运算。例如:
byte b = 20;
char c = 'a'; //相当于97
short s = 2000;
int sum = b + c + s; //b、c、s先转换为int类型,再相加
System.out.println(sum); //输出结果为2117
5.2 强制类型转换
//待补充