NedStarkOfWinterfell
NedStarkOfWinterfell

Reputation: 5203

Casting characters in Java

I am learning Java. I found that expressions often have to be cast to a certain type in order to do it right. For example, during arithmetic evaluation, bytes are promoted to integers, so the following expression will throw an error:

byte b = 10;
int i;
i = b*b;  //ok, assigning an integer evaluation to an integer variable
b = b*b;  // throws error, coz assigning integer evaluation to byte variable

Now, I know that assigning an integer to a character variable is all right: char a; a = 88; is okay. However, if I do this:

char c2 = 'b', c3 = 'c';
c2 = c2 + c3; //throws error
c2 = (char)(c2 + c3); //works fine

Why does it throw an error when not casted? After all, the right hand side is still an integer, so assigning an integer to a character variable should work just fine.

Upvotes: 6

Views: 417

Answers (8)

Priyanka.Patil
Priyanka.Patil

Reputation: 1197

There is a certain limit as to how much value each basic type can hold in java.Assigning the result of an arithmetic operation can produce an unpredictable result at run-time ,which JVM is unsure if char can hold,therefore the compilation error.

Upvotes: 0

NPE
NPE

Reputation: 500773

In c2 + c3, both operands are implicitly widened to int, so the result of the addition is also an int.

JLS §15.18.2. Additive Operators (+ and -) for Numeric Types:

Binary numeric promotion is performed on the operands (§5.6.2).

JLS §5.6.2. Binary Numeric Promotion:

When an operator applies binary numeric promotion to a pair of operands, each of which must denote a value that is convertible to a numeric type, the following rules apply, in order:

Widening primitive conversion (§5.1.2) is applied to convert either or both operands as specified by the following rules:

  • If either operand is of type double, the other is converted to double.

  • Otherwise, if either operand is of type float, the other is converted to float.

  • Otherwise, if either operand is of type long, the other is converted to long.

  • Otherwise, both operands are converted to type int.

You therefore end up with an int. Assigning it to a char variable requires an explicit cast.

You say:

Since integer value can be assigned to a character variable...

Only constant integer expressions can be assigned to a char variable without a cast.

JLS §5.2. Assignment Conversion:

In addition, if the expression is a constant expression (§15.28) of type byte, short, char, or int:

  • A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.

This automatic narrowing conversion doesn't apply here. You need an explicit cast.

Upvotes: 6

Andreas Dolk
Andreas Dolk

Reputation: 114817

An example for further clarification:

char c1 = Character.MAX_VALUE;
char c2 = Character.MAX_VALUE;
char c3 = (char) (c1 + c2);
int  i3 = c1 + c2;

System.out.printf("After casting to char: %s, the int value: %s%n", (int) c3, i3);

So with casting we actually got a wrong mathematical result.

Upvotes: 0

xxxxxxxxx
xxxxxxxxx

Reputation: 1019

Have a look at thread:

Integer arithmetic in Java with char and integer literal

The reason seems to be that "c2 = c2 + c3;" cannot be checked by the compiler (it is executed in runtime) whereas "char a; a = 88;" is directly done by the compiler.

Upvotes: 0

Evgeniy Dorofeev
Evgeniy Dorofeev

Reputation: 136072

char is 2 bytes and int is 4 bytes. When you write char c = 1; it does not mean that 1 is int, it's just a constant for javac and javac knows that 1 fits into char. But c2 = c2 + c3; is arithmetic operation, javac will interprets it as (int)c2 + (int)c3 and this produces int result. int does not fit into char so javac warns you that there may be lost of precision.

Upvotes: 0

Rohit Kumar
Rohit Kumar

Reputation: 1028

char c2 = 'b', c3 = 'c';
c2 = c2 + c3; //throws error
c2 = (char)(c2 + c3); //works fine

when you doing c2+ c3

ASCII value of these chars are added which returns a int result. when you are assigning int result to char it gives error.

Upvotes: 1

gogognome
gogognome

Reputation: 759

Assigning an int 88 to a char works, because the compiler can determine the value.

The case c2 = c2 + c3 cannot be handled by the compiler. The value c2 + c3 must be evaluated at run time. Therefore, the compiler cannot determine the actual char value that has to be assigned.

Upvotes: 0

Mathias Schwarz
Mathias Schwarz

Reputation: 7197

It does not necessarily work fine to assign an int to a char. Chars are only 16 bit and ints are 32 bit, so the there might be an overflow.

In general Java only allows assignment of primitives values without cast if no overflow can occur as a result of the assignment.

Upvotes: 3

Related Questions