一、问题一
- 请看如下代码,想想看编译和运行有没有问题?
public class Demo{ public static void main(String[] args){ byte a = 1; byte b = 2; byte c; c = 3 + 4; } }
编译结果:
编译和运行都没有问题,输出7 -
我们再来看另一段程序
public class Demo{ public static void main(String[] args){ byte a = 1; byte b = 2; byte c; c = a + b; System.out.println("c = "+c); } }
编译结果:
这是为什么呢?为什么c = a + b会报错呢?
按照我们正常的理解,将byte类型的a和b想加,再赋值给同样是byte类型的c,而且最后结果还没有超出byte范围,应该是没问题的。 -
请看箭头所指的两个数据类型,从int转换到byte可能会有损失。这说明了 a + b 是一个int类型,这是因为变量想加,首先要看类型,Java中整数的默认类型为int,所以变量在进行运算的时候,先将变量a和b想上提升为int类型的变量,他们想加的结果也是int类型,将int类型赋值给byte类型会丢失数据,所以编译报错。
-
那么为什么c = 3 + 4编译成功了呢?
因为3和4都是常量,常量运算的时候先进行运算,最后将结果赋值给byte类型,如果没有超过byte类型的范围,那么就不报错。否则就会报错。请看如下代码:public class Demo{ public static void main(String[] args){ byte c; c = 127 + 1; System.out.println("c = "+c); } }
编译结果:
同样编译报错,因为byte数据类型的范围在-128-127,而127 + 1的运算结果为128,不在范围其范围内,所以报错。
二、问题二
- 下面代码编译会报错,原因在上面已经解释。如果我就是想赋值那么该怎么办呢?输出的结果又是多少呢?
class Demo { public static void main(String[] args) { byte a = 130; System.out.println(a); } }
-
使用强制类型转换赋值
代码如下:class Demo { public static void main(String[] args) { byte a = (byte) 130; System.out.println(a); } }
运行结果:
结果为什么是-126呢?下面我将用一张图来给大家解释
关于原码、反码和补码的相关内容在此不做过多的阐述。
图画的不是很好,但是应该可以看的懂,请各位大佬见谅!