Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Casting characters in Java

Tags:

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.

like image 251
SexyBeast Avatar asked Dec 19 '12 11:12

SexyBeast


People also ask

What is casting in Java?

Type casting is when you assign a value of one primitive data type to another type. In Java, there are two types of casting: Widening Casting (automatically) - converting a smaller type to a larger type size. byte -> short -> char -> int -> long -> float -> double.

Can you cast char to String in Java?

We can convert a char to a string object in java by using the Character. toString() method.

What is type casting in Java with example?

Example: Converting double into an int int data = (int)num; Here, the int keyword inside the parenthesis indicates that that the num variable is converted into the int type. In the case of Narrowing Type Casting, the higher data types (having larger size) are converted into lower data types (having smaller size).

What is type casting with example?

In type casting, the compiler automatically changes one data type to another one depending on what we want the program to do. For instance, in case we assign a float variable (floating point) with an integer (int) value, the compiler will ultimately convert this int value into the float value.


2 Answers

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.

like image 143
NPE Avatar answered Sep 18 '22 02:09

NPE


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.

like image 25
Mathias Schwarz Avatar answered Sep 21 '22 02:09

Mathias Schwarz