今天在复习Java基础数据类型转换时,发现了一个问题:
byte test = 127 , test1 = 10 ,test2 = 20 ;
居然可以直接将int类型的127,10,20赋值给byte类型的test,test1,test2;
了解一下byte和int类型的取值范围:
byte类型,Java为其分配了一个字节内存,占8位,所有取值范围是:-2^7 ~ 2^7-1 ; 也就是 -128 到 127 ;
int类型,Java为其分配了四个字节内存,占32位,所有取值范围是:-2^31 ~ 2^31-1 ; 也就是 -2147483648 到 2147483647 ;
那么为什么可以直接赋值呢?
原来是因为系统有一个自动转换功能(也就是进行了底层转换,效果和 byte test = (byte) 127 ; 是一样的),只要赋予byte的值不超过byte的取值范围,系统都会自动帮你转换;
不过当赋予的值超过了byte类型的取值范围,那就要手动进行数据类型转换了,不然系统程序就报错了;
如: byte test3 = 128 ; //报错:Type mismatch: cannot convert from int to byte
改为:byte test3 = (byte) 128 ; 就可以了
其中char、short类型也是一样的,当赋予int类型的值不超过这些类型的取值范围,那系统就会自动进行数据类型转换了;
还有一个的问题,如下代码所示:
byte test = 20 , test1 = 30 ;
byte test4 = test + test1 ; //错误:Type mismatch: cannot convert from int to byte
为什么两个byte相加就错误呢?
原来是因为:系统防止两个数进行相加后的值有可能会溢出的危险,所以进行了数据类型自动转换。
例如以上改为:
byte test = 127 , test1 = 1 ;
byte test4 = test + test1 ; //那么test和test1在相加时就超出了bute类型的取值范围了
所以系统为了防止两个数进行相加后的值超过了原有的类型的取值范围,所以就进行了自动数据类型转换,因此出现了以上的错误问题;
也就是 byte test4 = test + test1 ; 相当于 byte test4 = (int) test + (int) test1; 所以就报错了 。
解决:
将 byte test4 = test + test1 ; 改为 byte test4 = (byte)( test + test1 ) ; 就可以了;
特别需要注意的地方:
当将一个 int类型的常量 赋值给 byte 类型变量 是可以的,以上已经进行了说明,但是将一个 int类型的变量 赋值给 byte 类型的变量时,是错误的,需要进行类型的强制转换;
如下代码所示:
byte test = 127 , test1 = 1 ; //正确
int testt = 10 ;
byte testb = testt ; //错误:Type mismatch: cannot convert from int to byte
修改:byte testb = (byte) testt ;