Java类型转换(自动类型转换+强制类型转换)
程序员文章站
2022-04-19 13:32:04
一、 自动类型转换(隐式类型转换)整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。自动转换从低级到高级。自动转换有以下规律:1、小的类型自动转化为大的类型2、整数类型可以自动转化为浮点类型,可能会产生舍入误差3、字符可以自动提升为整数示例代码:隐式类型转换 int i = 128; double b = i;//128.0整数类型可以自动转化为浮点类型,可能会产生舍入误差Float和Double提供了快速的运...
一、 自动类型转换(隐式类型转换)
- 整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
自动转换从低级到高级。
自动转换有以下规律:
1、小的类型自动转化为大的类型
2、整数类型可以自动转化为浮点类型,可能会产生舍入误差
3、字符可以自动提升为整数
示例代码:
隐式类型转换
int i = 128;
double b = i;//128.0
整数类型可以自动转化为浮点类型,可能会产生舍入误差
- Float和Double提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值
float floatValue1=2+10f;
float floatValue2=floatValue1-11.9f;
System.out.println(floatValue2);//0.10000038
字符可以自动提升为整数
char Value1 ='a';
int Value2=Value1+10;
System.out.println(Value2);//107
二、 强制类型转换(显式类型转换)
强制转换格式:(类型)变量名
- 强制类型转换,在要强制类型转换的前面加上括号,然后在括号里面加上你要转换的类型
(强制转换需要程序员手动处理)
注意点:
1、强制类型转换可能导致溢出或损失精度
2、在把容量大的类型转换为容量小的类型时必须使用强制类型转换
3、浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
4、不能对布尔值进行转换
5、不能把对象类型转换为不相干的类型
示例代码:导致溢出(1)
容量大类型转容量小类型
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
- 溢出: 数据类型超过了计算机字长的界限而出现的数据溢出。
int i = 128;
byte b = (byte)i;//-128 内存溢出
// 00000000 00000000 00000000 10000000 128的原码
// 00000000 00000000 00000000 10000000 128的反码
// 00000000 00000000 00000000 10000000 128的补码
// 10000000 的补码
// 11111111 反码
// 10000000
/**
* 关于 原码,反码,补码的知识(了解)
* 正数的反码,补码是其本身;
* 负数的反码是符号位保持不变,其余位取反;负数的补码是在其反码的基础上+1
*/
1、为什么会是负的呢?
2、byte 最大值是 127,这里给了它128,所以它超出了最大值,数据类型超过了计算机字长的界限而出现的数据溢出
示例代码:导致溢出(2)
package com.gr.demo;
public class demo4 {
public static void main(String[] args) {
//操作比较大的数的时候,注意溢出问题
//JDK7新特性,数字之间可以用下划线分割
int money = 10_0000_0000;
int years = 20;
int tota1 = money*years;//-1474836480 计算的时候溢出了
System.out.println(tota1);//-1474836480
long tota2 = money*years;//默认是int,转换之前已经存在问题了?
long tota13 = money*((long)years);//先把一个数转换为Long 在计算之前就把精度解决掉了
System.out.println(tota13);//20000000000
}
}
示例代码:损失精度
- int是要强制类型转换后的数据类型
- 浮点数转换整数是通过舍弃小数得到的,而不是四舍五入
System.out.println((int)23.7);//23 舍弃小数
System.out.println((int)-45.89f);//-45 舍弃小数
示例代码:字符强制转换成数字
char c1 = 'a';
char c2 = '中';
System.out.println(c1);//a
System.out.println((int)c1);//97 强制转换
System.out.println(c2);//中
System.out.println((int)c2);//20013 强制转换
- 注意:所有的字符本质还是数字
- Char类型 会涉及到Unicode编码问题 上面的小写a就代表着97,大写的A代表着65。
ASCLL编码表片段,这个不是很详细,大家可以大概看看:
本文地址:https://blog.csdn.net/weixin_44540414/article/details/107166296