🤓数据类型
在Java中数据类型主要分为两类: 基本数据类型和引用数据类型.。本文将介绍基本数据类型。
基本数据类型包括: 整型、浮点型、字符型以及布尔类型。
😎整型
Java中的整型有:byte,short,int,long
整型类型 | 默认值 | 占用空间大小(字节) | 取值范围 |
---|---|---|---|
byte | 0 | 1 | -128~127 |
short | 0 | 2 | -32768~32767 |
int | 0 | 4 | -2147483648 ~2147483647 |
long | 0L/l | 8 | -9223372036854775808 ~9223372036854775807 |
在Java中,与C语言相比,short和int这两个数据类型没有太大变化。然而,Java引入了byte(字节型)数据类型,它占用一个字节的存储空间,类似于C语言中的char类型。byte类型的取值范围是从-128到127。
与C语言不同的是,Java没有long long类型。在Java中,long(长整型)的大小始终为8个字节,而不像C语言中的long类型有时是4个字节,有时是8个字节。这一点非常重要,因为Java的数据类型在32位和64位环境下的大小是相同的,这保证了程序在不同平台上的可移植性。
🧐byte的范围
但是在Java中,基本数据类型都是有符号的,没有无符号的概念。符号位位于二进制序列的最高位,用于表示正负数。对于正数,只要数值位都是1,就可以取到最大值127。对于负数,最小值是-127(11111111),而-128(1000 0000)是通过将127的源码和1的源码相加得到的,这是人为规定的。在C语言和Java中,数据存储方面的原理是相似的。数据在内存中的存储是补码。数据的二进制序列中最高位是符号位。
😎浮点型
Java浮点型也是float和double。float大小为4个字节;double为8个字节。
但是在编辑器中
float a = 1.8;
这样编写,编译器就会报错 , 原因是在Java中浮点数默认的类型是double , 即1.8默认是8个字节的double而a是4个字节的float , 编译器自然就会报错,假设你有一杯水(double类型),而你需要将它装进一个小瓶子(float类型)。由于瓶子的容量较小,无法直接放下整杯水。这时,你需要进行强制类型转换,将水倒入小瓶子中。
float a = 1.8f;
在1.8后加上f或者F就好了 , 原因就是发生了,强制类型转换 , 把1.8变成了float类型将double类型的水(1.5)强制转换为float类型的瓶子。通过将水强制转换为float类型,我们就可以将它适应于较小容量的瓶子。
🧐浮点数的相关运算
这一点与c语言类似,所以就简短写一些注意点。
- 在Java中,整型除法可以转换为浮点数除法,通过将分子或分母乘以0.1来实现。然而,对于复杂的表达式或需要高精度计算的情况,可能会导致精度损失。为了避免这个问题,可以使用BigDecimal类进行精确的小数计算。
2.在Java中,浮点数的存储方式导致精度不准确。 由于浮点数使用二进制的科学计数法表示,位数有限,因此在表示某些十进制小数时可能会有 精度损失。 例如,使用有限位数的浮点数变量初始化为1.1,在二进制中无法精确表示,导致舍入误差。当进行乘法运算时,这个误差会累积,导致结果不精确为1.21。
😎字符类型
字符在计算机中本质上是用整数表示的。 在C语言中,使用ASCII编码表示字符,而Java使用Unicode编码表示字符。在Java中,一个字符占用两个字节,可以表示更多的字符种类,包括中文。需要注意的是,虽然Java中的字符使用两个字节表示,但并不是所有字符都只占用两个字节的存储空间。一些特殊的字符可能需要使用多个Unicode编码单元(多个字节)来表示。
char c1 = 'A'; // 大写字母
char c2 = '1'; // 数字字符
System.out.println(c1);
System.out.println(c2);
char c3 = '李';
System.out.println(c3);
😎布尔类型
布尔类型(boolean)在Java中用于表示真假,它只有两种取值,true表示真,false表示假。在Java中,boolean类型和int类型之间不能相互转换,不能使用1表示true,0表示false的方式。
另外,Java虚拟机规范并没有明确规定boolean类型占用几个字节的存储空间。具体的实现可以根据不同的Java虚拟机实现而有所不同。在实际开发中,boolean类型通常会被编译成一个字节的存储空间,但这并不是Java语言规范的要求。
while(1)
在这样写永真式,在c语言中可以运行,但是在Java中就会报错 因为()中要放布尔类型 ,1是整型。正确的写法如下
while(true)
🤓类型转换
类型转换在Java中是一种严格的校验机制。作为一门强类型编程语言,当不同类型的变量相互赋值或参与运算时,需要进行类型转换。
Java中的类型转换主要分为两类:自动类型转换(隐式)和强制类型转换(显式)。
😎自动类型转换(隐式)
自动类型转换是指将一个数据类型的值赋给另一个数据类型的变量时,如果目标数据类型的范围大于源数据类型,Java会自动进行类型转换,不需要显式地指定转换操作(也就是为什么叫隐式 因为编译器会自动转换)。例如,将一个整数赋值给长整型变量,或将一个字符赋值给整型变量。
// 自动类型转换示例
int num1 = 10;
long num2 = num1; // int自动转换为long
float num3 = 3.14f;
double num4 = num3; // float自动转换为double
char ch = 'A';
int ascii = ch; // char自动转换为int,表示字符的ASCII码值
😎强制类型转换(显式)
强制类型转换是指在需要将一个数据类型转换为另一个数据类型时,如果目标数据类型的范围小于源数据类型,就需要使用强制类型转换。强制类型转换需要使用括号将目标数据类型括起来,并在括号内指定需要转换的变量或表达式(也就是为什么叫显式,因为需要程序员手动写)。需要注意的是,强制类型转换可能会导致数据丢失或溢出,因此在进行强制类型转换时需要谨慎使用。
// 强制类型转换示例
double num5 = 3.99;
int num6 = (int) num5; // double强制转换为int,小数部分被截断
long num7 = 10000000000L;
int num8 = (int) num7; // long强制转换为int,超出int范围的部分会丢失
int num9 = 65;
char ch2 = (char) num9; // int强制转换为char,表示ASCII码值对应的字符
// 注意:强制类型转换可能导致数据丢失或溢出,需要谨慎使用
总结
- 在Java中,不同数字类型的变量之间赋值时,范围更小的类型可以隐式转换为范围较大的类型。这是因为范围更小的类型可以完全包含范围较大的类型的取值范围。例如,将一个整数赋值给长整型变量或将一个字符赋值给整型变量都是合法的隐式类型转换。
- 然而,如果需要将范围较大的类型赋值给范围较小的类型,就需要使用强制类型转换。强制类型转换需要使用括号将目标数据类型括起来,并在括号内指定需要转换的变量或表达式。需要注意的是,强制类型转换可能会导致精度丢失或溢出的问题。例如,将一个浮点数强制转换为整数时,小数部分会被截断。
- 当使用字面值常量进行赋值时,Java会自动检查数字范围是否超出目标类型的取值范围。如果超出范围,编译器会报错。这种检查是为了确保数据的安全性和正确性。
- 需要注意的是,强制类型转换不一定能成功,因为不相干的类型之间不能互相转换。只有在存在类型层次结构或类型兼容性的情况下,才能进行类型转换。
🤓类型提升
当同类型的数据进行运算时,数据类型较小的会被提升到数据类型较大的。这种提升称为自动类型提升或隐式类型转换。
例如,在byte和int之间的运算中,byte会被提升为int。如果我们有以下代码:
byte a = 10;
int b = 20;
int c = a + b; // 编译成功:a + b 是 int + int,结果是 int,可以赋值给 int
在第三行代码中,byte类型的变量a会被提升为int类型,然后进行相加操作,结果是int类型。因此,可以将结果赋值给int类型的变量c。
类似地,对于short和int的运算,也会进行自动类型提升:
short x = 25;
int y = 50;
int z = x + y; // 编译成功:x + y 是 int + int,结果是 int,可以赋值给 int
在第三行代码中,short类型的变量x会被提升为int类型,然后进行相加操作,结果是int类型。因此,可以将结果赋值给int类型的变量z。
需要注意的是,对于低于4个字节的byte和short类型,在参与运算时会被提升为int类型。这是因为计算机的CPU通常以4个字节为单位从内存中读写数据,为了硬件上的实现方便,将这些较小的类型提升为int类型进行计算。如下:
byte a = 30;
byte b = 50;
byte c = a + b;
这段代码编译会报错,a和b虽然都是byte,但是计算 a + b 会先将 a和b 都提升成 int,再进行计算,得到的结果也是 int,此时赋给c,就会出错。
如果这篇关于JAVA的数据类型与类型转换的博客给您带来了启发或触动了内心的某个琴弦,那我真诚地邀请您留下一份珍贵的点赞。您的支持是我创作的动力,也是我前行路上最美的鼓励。让我们一同续写 『赶路人–』 的故事,用文字的力量传递更多的温暖与智慧。