用byte数据类型切换case

时间:2014-06-16 14:13:07

标签: java

字节范围是-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");

        }
    }
}

3 个答案:

答案 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)

有两个原因:

  1. 由于118字面值为int,因此在int中添加字节和int结果,而不是byte。 (Java中没有.或后缀的所有数字文字都是int。)

  2. 因为您在其他情况下遗漏了break个陈述,所以无论您最终打开的 值是什么,您都会看到那个"谢谢你"输出,因为case语句从第一个匹配的语句开始按顺序运行。

  3. 有趣的是,即使你强迫所有的号码都是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,而不是一个字节。