Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why in java `char` casts to `int` instead of `short` or `byte`?

Tags:

java

casting

char

In the Great book of Bruce Eckel, Thinking in java, there is a very good sample test for method overloading that I've presented here with a little modifications. The writer is very delicate and mentions a strange point : char promotes to int instead of byte or short; but doesn't say the reason! Does anybody knows the reason?
[Please look at the strange output of the 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(); 
    } 

}
like image 956
mohsen kamrani Avatar asked Jan 11 '23 02:01

mohsen kamrani


1 Answers

char is promoted to an int because that is the closest type that can hold all of char's values without loss of precision.

char is a 16-bit unsigned type, so neither byte nor short could hold all of its values (byte is only 8 bits; short is 16 bits, but it is signed).

like image 193
Sergey Kalinichenko Avatar answered Jan 25 '23 23:01

Sergey Kalinichenko