一 关于有运算符的转换
举例:
char c = 'a'+1;//不会报错
char ch = c + 1;//会报错
原因:
第一种不报错,是因为右边都是常量,编译器在编译的时候会进行自动合并,不做类型转换,编译阶段就完成,不报错。
第二种报错,是因为右边有变量进行运算,编译器不会进行自动合并,所以在运行时进行编译,发现c是变量,char型,1是int型,所以结果转换为int型,所以会报错。
还有一个未解决;
char c= 145;//不报错
char ch = 70000;//报错
float f = 0.2;//报错
第一个不报错的原因是因为145没超出范围,可以,而第二行超出范围,报错
第三行是因为小数默认为double型的,精度不同,所以出错。
但是为啥两者有不同,我目前还不太懂
二赋值超过范围的转换
举例:
byte b = 127;
b += 1;//相当于b = byte(b+1);
System.out.println(b);
输出结果为-128.
首先byte是一字节,范围-128~127,以补码表示
当byte的127加1的时候具体运算是:
数 | 补码 |
---|---|
127 | 01111111 |
+1 | 00000001 |
-128 | 10000000 |
同样,当再次加1时,会出现
byte b = 127;
b += 1;//相当于b = byte(b+1);
System.out.println(b);
b += 1;
System.out.println(b);
输出结果为-128和-127
当byte的-128再加1的时候具体运算是:
数 | 补码 |
---|---|
-128 | 10000000 |
+1 | 00000001 |
-127 | 10000001 |