Java学习笔记——Java的基本数据类型以及数据类型转换

在Java中,有两大数据类型——基本数据类型和引用数据类型,本文章介绍基本数据类型。
基本数据类型(Primitive type)分为四类八种,分别是

  • 整型(byte、short、int、long)
  • 浮点型(float、double)
  • 布尔型(boolean)
  • 字符型(char)

一、整型(byte、short、int、long)

1.1 整型概览

整型用于表示整数,包括正整数、0和负整数。整型分为四种:byte、short、int、long ,如下表所示:

名称关键字占用字节数范围备注
字节型byte1-128~127
短整型short2-32768~32767
整型int4-2147483648~2147483647(约±21亿)最常用
长整型long8约±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 = 0b‭0100_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)两种。

名称关键字占用字节数范围有效位数备注
单精度float4约±3.4E+386~7位少用,须加后缀F或f
双精度double8约1.797E+30815位可选后缀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 自动类型转换

自动类型转换即由系统自动地进行转换,通常是由小容量的类型转换为大容量的类型,下图表示了自动类型转换,其中,实线箭头表示没有精度损失的转换,虚线箭头表示可能存在精度损失的转换。
Java自动类型转换
自动类型转换常常发生在以下情形:
(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 强制类型转换

//待补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值