自动类型转换
自动类型转换:
容量小的数据类型可以自动转换为容量大的数据类型.
{这里的容量并不是字节数而是表述的范围}
Int i=3;
Double d=1;
Float f=1;
Double d2=f;
特例:
可以将整型常量直接赋值给byte ,short,char等类型变量, 而不需要运行强制类型转换,只要不超过其表数范围
Short b=12; //合法
Short b=1234567;//非法
看下图 : 按箭头表示的方向就代表可以自动转
比如:
byte转short没有问题 Short转int没有问题 Char转int也没有问题 Int转为long没有问题 Int转为double没有问题 float转为double没有问题
Int也可以转float但是有可能损失精度 Long也可以转为float有可能损失精度 Long也可以转为double有可能损失精度
注:
在java代码中print输出中文时,会显示乱码,这个时候先在vs 打开.java文件到编辑器界面,然后在vs code 界面右下角,点以下那个默认的 UTF-8 ,然后在弹出的选项选择第二个:以编码方式保存,然后在接下来弹出的下拉选项输入框输入GBK,选择gbk编码回车(或者直接鼠标点以下GBK这一行),等待左下角compile完成后,再次运行就能输出无乱码的中文了。
强制类型转换
强制类型转换,又被成为造型,用于显式的转换一个数据的类型,在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度减低或溢出..
当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值.
运算时类型提升问题
基本类型转化时常见错误和问题
操作比较大的数时,要留意是否溢出,尤其是整数操作时
Int money = 1000000000; //10亿
Int years = 20;
Int total = money*years;//返回一个负数
Long total1= monuy*years;//返回的仍然是负数,默认是int,因此结果会转成int值,再转成long.但是已经发生了数据丢失
Long total2 =money*(long)years;//先将一个因子变成long,整个表达式发生提升.全部用long来计算
L和l的问题:
-不要命名名字为的变量
-long类型使用大写L不要写小写.
// 测试自动转型和强制转型
public class Testchar {
public static void main(String[] args) {
// byte b=123;
// byte b2=300;
// 可能损失精度
// char c=-3;
// char c2='a';
// int i=c2;
// int可以自动转型为long\
// long d01=123456;
// 可能损失精度
// float f=d01;
// 容量小的数据类型可以自动转换为容量大的数据类型.
// {这里的容量并不是字节数而是表述的范围}
// int i2 =-100;
// int转char自动转型会报错提示(不兼容的类型: 从int转换到char可能会有损失),
// 强制类型转换在标识符强制类型转换为的类型就ok
// -100超过char的表数范围,所以转换成完全不同的值,无意义的值
// char c3=(char)i2;
// System.out.println(c3);
// 运算时类型提升问题
int a=3;
long b=4;
double d=5.5;
// 这里提升为long;
// 这里自动提升类型为long 用(int)(a+b)强制转型为int并赋值给int同类型
int c=(int)(a+b);//做所有的二元运算符(+-*/%),都会有类型提升的问题
System.out.println(c);
// 这里自动提升类型为double 用(float)(a+d)强制转型为float并赋值给float同类型
float f= (float)(a+d);//如果超了范围不行的话,进行自动转型
System.out.println(f);
int money = 1000000000; //10亿
int years = 20;
// 两个int乘完的值也是int明显数值溢出了所以出了一个负值
// int total = (long)money*years;//返回一个负数
// 这里的值已经溢出了必须先转型在赋值
// long total = (long)(money*years);//返回一个负数
long totall = (long)money*years;
// System.out.println(total);
System.out.println(totall);
// 一个人70年心跳多少次
// 建议以后把L放在最前面,因为有可能在前面承德时候已经溢出了,继续乘还是溢出的值
long times = 70L*60*24*365*70;
System.out.println(times);
}
}
本文来自博客园,作者:神奇的梦,转载请注明原文链接:https://www.cnblogs.com/fantasticDream/p/16264903.html