基本数据类型变量的强制类型转换

基本数据类型变量的强制类型转换

问题:将3.14赋值到int类型变量会发生什么?

int i = 3.14; // 编译报错

解答:想要赋值成功,只有通过强制类型转换,将double类型强制转换成int类型才能赋值.

规则:将取值范围大(或容量大)的类型强制转化成取值范围小(或容量小)的类型

  • 自动类型提升是Java自动执行的,而强制类型转换是自动类型提升的逆运算,需手动执行

此VariableTest4.java用来测试强制类型转换
规则:

  1. 如果需要将容量大的变量的类型转换为容量小的变量的类型,需要使用强制类型转换
  2. 强制类型转换需要使用强转符:() 在()内指明要转换为的数据类型
  3. 强制类型转换过程中,可能导致精度损失。
class VariableTest4{
    public static void main(String[] args){
    double d1 = 12; // 自动类型提升  由int整型提升到double浮点数类型
 
    // 编译不通过
    // int i1 = d1;
    // 错误原因:从double转换到int可能会有损失 
   
    int i2 = (int)d1;
    System.out.println(i2);
}
long l1 = 123;
// 编译失败
// short s1 = l1;
short s2 = (short)l1;
System.out.println(s2);
// 练习
int i3 = 12;
float f1 = i3; //自动类型提升
System.out.println(f1); // 注意:此时的值为12.0

float f2 = (float)i3; //编译可以通过,只不过可以省略()而已
// 精度损失的例子1:
double d2 = 12.9;
int i4 = (int)d2;
System.out.println(i4); //结果为12,损失精度(截断多余的数据)

// 精度损失的例子2:
int i5 = 128;
byte b1 = (byte)i5;
System.out.println(b1); // 运行结果为-128
// 实际开发举例:
byte b2 = 12;
method(b2);

long l2 = 12L;
// 编译不通过
// method(l2)
method((int)l2);

public static void method(int num){ // int num = b2;自动类型提升
   System.out.println("num = " + num);
}

练习:

short s = 5;
s = s - 2;  
//编译不通过

// 原因:编译通不过的原因是因为在这段代码中,将一个int类型的字面量值2赋值给了一个short类型的变量s,这会导致数据类型的截断(type truncation)。

// 具体来说,s - 2会被解释为将short类型的变量s和int类型的字面量值2都转换为int类型进行运算,结果也是int类型。然后再将int类型的结果赋值给short类型的变量s时,会发生数据类型截断,可能导致精度损失或溢出等问题。

// 解决这个问题的方法是将2强制转换为short类型,即使用s = (short)(s - 2)来进行赋值操作。这样就可以避免数据类型截断导致的编译错误。

byte b = 3;
b = b + 4;  // 判断:编译不通过
b = byte(b + 4); // 判断:编译通过
// 这段代码编译不通过,会出现编译错误。

// 原因是在这个代码中,将一个int类型的字面量值4赋值给了一个byte类型的变量b,这会导致数据类型的截断(type truncation)。

// 具体来说,b + 4会被解释为将byte类型的变量b和int类型的字面量值4都转换为int类型进行运算,结果也是int类型。然后再将int类型的结果赋值给byte类型的变量b时,会发生数据类型截断,可能导致精度损失或溢出等问题。

// 解决这个问题的方法是将4强制转换为byte类型,即使用b = (byte)(b + 4)来进行赋值操作。这样就可以避免数据类型截断导致的编译错误。

char c = 'a';
int i = 5;
float d = .314F;
double result = c + i + d; 

// 判断: 这段代码可以通过编译,不会出现编译错误。

// 原因是在这个代码中,char类型变量c、int类型变量i和float类型变量d都进行了数值运算,但是它们会在运算时被自动转换为更高精度的类型,即int、float和double类型。因此,c + i + d的结果会被自动转换为double类型,并且可以被赋值给double类型的变量result。

// 需要注意的是,char类型的变量c在参与运算时会被自动转换为其对应的ASCII码值。因此,c + i + d的结果实际上是97 + 5 + 0.314 = 102.314,即double类型的值102.314。

float d = .314F; // 0.314中的"0"可以省略
// 注意: 在Java中,浮点类型的字面量值默认是double类型的。如果希望将一个浮点类型的字面量值显式地指定为float类型,可以在字面量后添加后缀F或f。因此,.314F表示一个float类型的字面量值,其值为0.314。

byte b = 5;
short s = 3
short t = s + b;
// 判断:可以通过编译,不会出现编译错误
// 原因:在这个代码中,byte类型变量b和short类型变量s进行了数值运算,但是它们会在运算时被自动转换为更高精度的类型,即short类型。因此,s + b的结果会被自动转换为short类型,并且可以被赋值给short类型的变量t。
// 注意:如果将两个byte类型的变量进行运算得到的结果是int类型,而不是byte类型。但是,将byte类型的变量和short类型的变量进行运算时,它们会被自动转换为更高精度的short类型,并得到short类型的结果。

问答:为什么标识符的声明规则里要求不能数字开头?

// 如果允许数字开头,则如下的声明编译就可以通过:
int 123L = 12;
// 进而,如下的声明中l的值到底是123?还是变量123L对应的取值12呢?出现歧义了。
long l = 123L;

笔记来源:

尚硅谷Java零基础全套视频教程第二十九集

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值