Java之基本数据的类型转换

自动类型提升

1.boolean不允许进行类型转换

布尔类型boolean占有一个字节,由于其本身的特殊含义,使得与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换),否则将编译出错。

2.数值范围小的类型→数值范围大的类型,JVM在编译过程中负责对数值类型进行自动提升

byte a = 1000;   // 编译出错 Type mismatch: cannot convert from int to bytefloat b = 1.5;   // 编译出错 Type mismatch: cannot convert from double to floatbyte c = 3;      // 编译正确

【例外】前两句很好理解,但int赋值byte类型编译正确是因为:

int→(byte/char/short)的类型转换在一定条件下不需强制转换

JVM在编译过程中,默认为int类型的数值赋值给一个比int型数值范围小的数值类型变量(在此统一称为数值类型k,k可以是byte/char/short类型)会进行判断,若此int型数值超过k的范围,则会直接编译出错。但若此int型数值尚在数值类型k范围内,jvm会自定进行一次隐式类型转换,将此int型数值转换成类型k。

3.byte→char,char→short不进行自动类型提升

由于数值范围的原因,使得byte、short与char之间无法进行类型转换,但byte可以提升至short类型。

4.数据的默认类型

Java中,整数类型(byte/short/int/long)对于未声明数据类型的整形默认为int类型;浮点类型(float/double)默认为double类型。

long a = 10000000000; //编译出错: The literal 10000000000 of type int is out of range 

10000000000默认数据类型是int,而int的数值范围是-2^31 ~ 2^31-1,显然超出范围,所以编译报错,这里只需要申明自生默认类型即可。-----long a = 10000000000L; //编译正确

数值类型的强制转换

1.强制类型转换一数值类型转换至范围更低,可能会丢失精度

byte p = 3; // 编译正确:int到byte编译过程中发生隐式类型转换int a = 3;byte b = a; // 编译出错:cannot convert from int to bytebyte c = (byte) a; // 编译正确float d = (float) 4.0;

分析:b=a编译报错是因为a是变量,编译期无法确定。

2.强制类型转换的原理分析

int a = 233;byte b = (byte) a;System.out.println("b:" + b);  // 输出:-23

分析:233的二进制表示为:24位0+11101001,byte只有8位,从高位开始舍弃得到:11101001,由于最高位为符号位,1表示负数,其相应数值表示为-23。

3.进行数学运算时,数据类型会自动提升到运算符左右之较大者

byte e = 10, f = 11;byte g = e + f; // 编译错误 +直接将10和11类型提升为了intbyte h = (byte) (e + f);  //编译正确

关于强转丢失精度的相关底层原理可查看Java之&0xff用法解析以及原码、反码、补码相关知识

来自为知笔记(Wiz)

时间: 2024-11-05 06:13:42

Java之基本数据的类型转换的相关文章

Java基本类型与类型转换咋就这么烦?

在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型.(一个字节等于8个bit) 1.整型类型              存储需求     bit数    取值范围      备注int                 4字节           4*8 short             2字节           2*8    -32768-32767long              8字

Java多态对象的类型转换和动态绑定

Java多态对象的类型转换这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常. 在继承链中,我们将子类向父类转换称为"向上转型",将父类向子类转换称为"向下转型". 很多时候,我们会将变量定义为父类的类型,却引用子类的对象,这个过程就是向上转型.程序运行时通过动态绑定来实现对子类方法的调用,也就是多态性. 然而有些时候为

Java杂谈之各种类型转换

在写程序时,难免会遇到类型转换的问题,下面列出了各种类型的转换方法,我们要做的 只是会举一反三就可以了. package JavaTestString; //包装类 //char----charcter //float---Float //int-----Integer //boolean-Boolean public class JavaTypeConvert { public static void main(String[] args) { //Sting的类型转化--> 基本类型: 包装

Java中的基本类型转换,数据溢出原理

java中的数据类型 java是一种强类型语言,在java中,数据类型主要有两大类,基本数据类型和引用数据类型,不同的数据类型有不同的数据存储方式和分配的内存大小. 基本数据类型中,各数据类型所表示的范围也是不一样的,如下所示: 由于在java中,整数默认是采用int型,浮点数默认采用的是double型进行存储,所以在定义long型和float型数据时,必须在数值后面加'l','L'和'f','F',如: 1 long a = 1000l; 2 long b = 2000L; 3 float c

Java基本数据类型与类型转换

Java基本数据类型与类型转换 文本关键字:8种.基本数据类型.整数类型.浮点类型.字符类型.布尔类型 一.基本数据类型 1. 概述 在Java中,所使用到的类型可以分为两大类,一类是基本数据类型,一共有8种,包含:整数,小数,字符,布尔.另外一类是引用类型,包含:字符串,数组以及各种Java类. 2. 整数类型 整数类型是一个很常用,也比较简单的类型,在计算机中以二进制的方式存储,其中有一位是符号位. byte:-2^7 ~ 2^7 - 1 1字节 8bit short:-2^15 ~ 2^1

Java基础-基本数据类型转换案例

java基本数据类型八中 byte = Byte short = Short char = Character int = Integer long = Long float = Float double = Double boolean = Boolean 本文通过几个简单的转换关系连接顺序 运行一个实例查看输出结果 byte b = 'a'; short s = 'a'; char c = 'a'; int i = 5; long l = 5l; float f = 5.5f; double

Java中基本数据的包装类

java中基本数据类型的包装类有:Character.Boolean.Byte.Short.Integer.Long.Float和Double. 基本数据类型:char.  boolean.  byte.short. int .   long.   float. double 这些包装类位于java.lang包中,包装类可以将基本的数据类型当作对象处理. 1. Character类 Character character = new Character('a'): //创建一个Character

java基础02 数据类型转换

一.回答问题 float f1 = 6.66f; float f2 = (float) 6.67; f1==f2? /** * * @author sun * */ public class Demo { public static void main(String[] args) { float f1 = 6.67f; float f2 = (float) 6.66; System.out.println(f1-f2); System.out.println(f1==f2); } } 输出:

java基础--------运算符与类型转换

运算符 运算结果 低精度向高精度靠拢 如 Long+float=double 常量整形默认 int 没有声明数据类型的整形默认为int    如: 123  在编译器会默认将它识别为(int)123 常量实型默认 double ... 如 1.2345 ... double (1.2345) Short i=3; i=i+1; 丢失精度 ----> short 变量=short 变量  +(int)1 运算符优先级 优先级:++ 变量名  >  =  >  变量名++ 前自增的优先级比赋