Java char is also an int?

3.9k views Asked by At

I was trying to get some code done for class:

public int getValue(char value) {
    if (value == 'y') return this.y;
    else if (value == 'x') return this.x;

Since I might not be able to return anything in the end, it told me to do this at the end:

return value;

This surprised me because the return type for the method was of type int. Yet, it was telling me to return a char! I'm using eclipse, and accustomed to the endless number of warnings and stuff, this was a major surprise.

So, is a char really an int? Why is this happening?

7

There are 7 answers

0
Sotirios Delimanolis On BEST ANSWER

The Java Language Specification states

When a return statement with an Expression appears in a method declaration, the Expression must be assignable (§5.2) to the declared return type of the method, or a compile-time error occurs.

where the rules governing whether one value is assignable to another is defined as

Assignment contexts allow the use of one of the following:

and

19 specific conversions on primitive types are called the widening primitive conversions:

  • char to int, long, float, or `double

and finally

A widening primitive conversion does not lose information about the overall magnitude of a numeric value in the following cases, where the numeric value is preserved exactly: [...]

A widening conversion of a char to an integral type T zero-extends the representation of the char value to fill the wider format.

In short, a char value as the expression of a return statement is assignable to a return type of int through widening primitive conversion.

0
Jakob Weisblat On

A char is smaller than an int, so you can return it and it will prepend zeroes to make a longer number. That's not the right thing to return - in your case I'd probably throw an exception instead; however, the editor suggested it because it's something that you're allowed to return and you need to return something.

The following code is legal:

char c = 'h';
int i = c;
4
Dici On

There is an implicit and natural conversion from int to char and vice-versa. Note that you thus have the usual arithmetic defined on charm which comes very handy when you want, let's say, to iterate on the alphabet :

for (char c='a' ; c<='z' ; c++) { ... }

However, note that a char is 2 bytes long whereas an int is 4 bytes long, so casting an int down to a char may result in an integer overflow.

0
rghome On

In computing, everything is numbers! Just bits and bytes.

int, char, byte, short and long are just numbers. A char is just a number that the compiler knows is usually used for displaying the character represented by the particular number (e.g. 32 = space, 48 = zero, etc).

A String is a sequence of numbers and other stuff, so a bit more complicated. We don't want to go there.

An int is a four byte number and a char is a two byte number, so you can fit any char number in an int.

The designers of Java just decided they would let you convert from char to int without requiring any special casts or conversions.

0
RealSkeptic On

A char is not an int. However, it is an integral type. That is to say, it's considered to be a whole number that can be converted to and from other integral types (long,short,byte and int), according to the Java Language Specification.

Basically what this means is that it is assignment-compatible to int. Its value is between 0 and 65535, and if you assign it to an int or cast it to an int and print it, you'll get the UTF-16 value of the character it represents.

0
MrEbbinghaus On

By definition (in java) a char is an 8bit unsigned integer. (0 to 256)

An int an 32bit signed integer. (−2.147.483.648 to 2.147.483.647)

char a = 65;                    //65 is the ASCII Number of 'A'
System.out.println(a);
>>> A

b = a + 1
System.out.println(b);
>>> B

java autoboxing converts char to int and vice versa

2
javaHacker On

Hope this little example solves your confusion:

public int getValue(int value) { 
    if (value == 'y') 
        return this.y; 
    else if (value == 'x') 
        return this.x; 
}

If you pass char as an int like getValue('x'), it would return the value of the int.