为什么在Java中`char`转换为`int`而不是`short`或`byte`?

4
在Bruce Eckel的巨著《Java编程思想》中,有一个非常好的方法重载示例测试,我在此基础上稍作修改。作者非常细致,提到了一个奇怪的点:char 提升为int,而不是 byteshort;但是他没有说出原因!是否有人知道原因呢?
[请看testChar()方法的奇怪输出]
public class TypeCast {
    void f1(char x) { print("f1(char) "); } 
    void f1(byte x) { print("f1(byte) "); } 
    void f1(short x) { print("f1(short) "); } 
    void f1(int x) { print("f1(int) "); } 
    void f1(long x) { print("f1(long) "); } 
    void f1(float x) { print("f1(float) "); } 
    void f1(double x) { print("f1(double) "); } 
    void f2(byte x) { print("f2(byte) "); } 
    void f2(short x) { print("f2(short) "); } 
    void f2(int x) { print("f2(int) "); } 
    void f2(long x) { print("f2(long) "); } 
    void f2(float x) { print("f2(float) "); } 
    void f2(double x) { print("f2(double) "); } 
    void f3(short x) { print("f3(short) "); } 
    void f3(int x) { print("f3(int) "); } 
    void f3(long x) { print("f3(long) "); } 
    void f3(float x) { print("f3(float) "); } 
    void f3(double x) { print("f3(double) "); } 
    void f4(int x) { print("f4(int) "); } 
    void f4(long x) { print("f4(long) "); } 
    void f4(float x) { print("f4(float) "); } 
    void f4(double x) { print("f4(double) "); } 
    void f5(long x) { print("f5(long) "); } 
    void f5(float x) { print("f5(float) "); } 
    void f5(double x) { print("f5(double) "); } 
    void f6(float x) { print("f6(float) "); } 
    void f6(double x) { print("f6(double) "); } 
    void f7(double x) { print("f7(double) "); } 
    void testConstVal() { 
        print("5: "); 
        f1(5);f2(5);f3(5);f4(5);f5(5);f6(5);f7(5); print(""); 
    } 

    void testChar() { 
        char x = 'x';
        print("char: "); 
        f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testByte() { 
        byte x = 0; 
        print("byte: "); 
        f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testShort() { 
        short x = 0; 
        print("short: "); 
        f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testInt() { 
        int x = 0; 
        print("int: "); 
        f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testLong() { 
        long x = 0; 
        print("long: "); 
        f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testFloat() { 
        float x = 0; 
        print("float: "); 
        f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testDouble() { 
        double x = 0; 
        print("double: "); 
        f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    }

    void print(Object o) {
        System.out.println(o);
    }
    public static void main(String[] args) { 
        TypeCast p =  new TypeCast(); 
        p.testConstVal(); 
        p.testChar(); 
        p.testByte(); 
        p.testShort(); 
        p.testInt(); 
        p.testLong(); 
        p.testFloat(); 
        p.testDouble(); 
    } 

}

你是在询问为什么Java的设计者会以他们现有的方式进行设计吗? - joragupra
可能相关:https://dev59.com/53PYa4cB1Zd3GeqPgThu - Rahul
1
@Paul Hicks 在Java中,一个char由2个bytes组成。 - Patrick
@PaulHicks:似乎每种类型都会提升到比它大的最接近的类型,而char的行为不同。 - Mohsen Kamrani
@MarkoTopolnik:您能否详细解释一下? - Mohsen Kamrani
2
大家好,这里没有什么可看的了。是时候清理注释了。 - Paul Hicks
1个回答

9

char被提升为int,因为这是最接近的类型,可以在不失精度的情况下容纳所有char的值。

char是一个16位的无符号类型,所以byteshort都不能容纳它的所有值(byte只有8位;short是16位,但它是有符号的)。


这是有理数。谢谢。我测试了这两个短语句 s = 65535;//引起错误。但 char c = 65535;//运行良好。 - Mohsen Kamrani
3
仅供记录:规则也有例外;int 被提升为 floatlong 被提升为 double,尽管可能会丢失一些精度,但仅安全地保留了数值的大小。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接