字节范围是-128到127.但是在下面的代码中,它超出了字节范围,代码输出是“谢谢”。
class Solve {
public static void main(String args[]) {
byte by=10;
switch(by+118) {//here it go beyond the byte range.
default:System.out.println("Sunday");
case 0:System.out.println("Monday");
case 128:System.out.println("Thank u");
}
}
}
答案 0 :(得分:5)
默认情况下,118(称为文字)是一个int。
将118(即int)添加到字节时,结果存储在int中。这意味着你的switch语句包含一个int。
所有其他文字(0和128)也都是整数。
请注意,如果您确实将结果保存在字节变量中,您将遇到溢出,并且值将会回滚。尝试使用此代码,该代码已被清理以包含必要的break语句:
public class Test{
public static void main(String args[]){
byte by=10;
byte result = (byte) (by + 118);
System.out.println("Result: " + result);
switch(result){
default:
System.out.println("default");
break;
case 0:
System.out.println("0");
break;
case -128:
System.out.println("-128");
break;
}
}
}
答案 1 :(得分:2)
有两个原因:
由于118
字面值为int
,因此在int
中添加字节和int
结果,而不是byte
。 (Java中没有.
或后缀的所有数字文字都是int
。)
因为您在其他情况下遗漏了break
个陈述,所以无论您最终打开的 值是什么,您都会看到那个"谢谢你"输出,因为case
语句从第一个匹配的语句开始按顺序运行。
有趣的是,即使你强迫所有的号码都是byte
s,你仍然最终会做出这样的事情。感谢你"路线:
class Solve {
public static void main(String args[]) {
byte by=10;
switch((byte)(by+118)) {
default:System.out.println("Sunday");
case (byte)0:System.out.println("Monday");
case (byte)128:System.out.println("Thank u");
}
}
}
输出:
Thank u
那是因为(byte)128
的值为(byte)-128
(是,否定),因为它溢出了byte
容器并且包裹着,(byte)((byte)10 + 118)
也是如此。因此,即使您在源代码中编写了case (byte)128:
,它仍然使用-128
。你可以很容易地看到这一点:
System.out.println((byte)128 == (byte)-128);
输出:
true
答案 2 :(得分:0)
因为你正在打开一个int,而不是一个字节。