我们知道,每种类型都有自己的字节数和取值范围。而我们所取的数据理应也要在这个范围之内。在了解自动类型转换和强制类型转换之前,我们应当知道有哪些数据类型,如:byte、short、int、long、float、double、char、boolean等。
一、自动类型转换
自动类型转换是计算机帮你完成的。其转换规则是从存储范围小的类型转换为存储范围大的类型。
如byte和int,byte所定义的变量可以赋值给int所定义的变量。
在自动类型转换中如果数据超出这个类型的取值范围,那么系统会报错。
二、强制类型转换
在强制类型转换中,其转换规则与自动类型转换相反,它是从存储范围大的类型转换为存储范围小的类型。
从这个代码可以直观的看出强制类型转换的形式(要给类型加上括号)。
在强制类型转换中,如果数据超出字节较小类型的取值范围,系统依旧能给出输出结果。但结果却不是你想的那个数。
这是因为计算机的底层是二进制,每种类型的输出数据都是由二进制表示出来的。int类型的存储空间大,转换成byte类型时其补码要舍去多余的部分,而正是这个原因,使得系统输出了切割后的数据。如果你们想要知道为什么得到的结果是-56,就可以去看看原码、反码和补码之间的联系。
三、运算式中的常量
在java的运算式中,一般来说,整数常量的默认类型是int类型。
首先先来看这个代码:
我们都知道这个代码输出的是20,但我们现在有两个不同类型的变量却能进行相加减,这个10代表的类型到底是byte还是int呢?所以我们先要了解10是什么意思。
对于一个变量运算 byte a=10; 来讲,如果赋值号右边只有数字出现,那么这个数字可以被当作常量来看待,当这个数字是在前面类型的取值范围内,那么可以直接赋值给变量a;如果赋值号右边既有数字又有变量出现,如 byte a=a+10; ,此时这个10应当默认是int类型,而不是常量。而不同类型不能相加,因此系统会报错。