How can I convert a char to int in Java?
The ASCII table is arranged so that the value of the character '9'
is nine greater than the value of '0'
; the value of the character '8'
is eight greater than the value of '0'
; and so on.
So you can get the int value of a decimal digit char by subtracting '0'
.
char x = '9';
int y = x - '0'; // gives the int value 9
Java implicit conversion between int and char
Just write the char conversion to ASCII code (below your statements)
int x = '0' + 1 - '5'
48 + 1 - 53 = -4
int y = '5' - 0 + '1'
53 - 0 + 49 = 102
int y = '5' - '0' + '1'
53 - 48 + 49 = 54
Notice it's consistent, each int remains int and each char converted to ASCII code
Java - char, int conversions
The first example (which compiles) is special because both operands of the addition are literals.
A few definitions to start with:
Converting an
int
tochar
is called a narrowing primitive conversion, becausechar
is a smaller type thanint
.'A' + 1
is a constant expression. A constant expression is (basically) an expression whose result is always the same and can be determined at compile-time. In particular,'A' + 1
is a constant expression because the operands of+
are both literals.
A narrowing conversion is allowed during the assignments of byte
, short
and char
, if the right-hand side of the assignment is a constant expression:
In addition, if the expression [on the right-hand side] is a constant expression of type
byte
,short
,char
, orint
:
- A narrowing primitive conversion may be used if the variable is of type
byte
,short
, orchar
, and the value of the constant expression is representable in the type of the variable.
c + 1
is not a constant expression, because c
is a non-final
variable, so a compile-time error occurs for the assignment. From looking at the code, we can determine that the result is always the same, but the compiler isn't allowed to do that in this case.
One interesting thing we can do is this:
final char a = 'a';
char b = a + 1;
In that case a + 1
is a constant expression, because a
is a final
variable which is initialized with a constant expression.
The caveat "if […] the value […] is representable in the type of the variable" means that the following would not compile:
char c = 'A' + 99999;
The value of 'A' + 99999
(which is 100064
, or 0x186E0
) is too big to fit in to a char
, because char
is an unsigned 16-bit integer.
As for the postfix ++
operator:
The type of the postfix increment expression is the type of the variable.
...
Before the addition, binary numeric promotion* is performed on the value
1
and the value of the variable. If necessary, the sum is narrowed by a narrowing primitive conversion and/or subjected to boxing conversion to the type of the variable before it is stored.
(* Binary numeric promotion takes byte
, short
and char
operands of operators such as +
and converts them to int
or some other larger type. Java doesn't do arithmetic on integral types smaller than int
.)
In other words, the statement c++;
is mostly equivalent to:
c = (char)(c + 1);
(The difference is that the result of the expression c++
, if we assigned it to something, is the value of c
before the increment.)
The other increments and decrements have very similar specifications.
Compound assignment operators such as +=
automatically perform narrowing conversion as well, so expressions such as c += 1
(or even c += 3.14
) are also allowed.
Fastest way to convert numeric chars to int
The two versions are not equivalent:
- The
Character.getNumericalValue(...)
methods work for a variety of characters that represent digits or numbers, and it will return-1
or-2
in cases where the character doesn't represent a non-negative integer. - The
num - '0'
approach only gives the correct answer for the codepoints that correspond to the ASCII characters'0'
through'9'
. For all other codepoints or codeunits, it gives a meaningless value.
- The
The
num - '0'
version will be faster. This is clear from looking at the source code forgetNumericalValue(...)
.While the difference is significant in relative terms, it is very small in absolute terms.
I concur with the comments that say that this is most likely a premature optimization.
It is also an incorrect optimization in some contexts.
I use it a lot so was wondering if I was using the most efficient one.
This is definitely premature optimization :-)
The number of times you write a particular code sequence is unrelated to performance of the code sequence when is executed. A section of code is only worth optimizing if the time spent executing it makes a significant difference to your entire application.
Java char is also an int?
The Java Language Specification states
When a return statement with an
Expression
appears in a method
declaration, theExpression
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:
- a widening primitive conversion (§5.1.2)
and
19 specific conversions on primitive types are called the widening
primitive conversions:
char
toint
,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 typeT
zero-extends the
representation of thechar
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.
Java Implicit conversion char to int?
Array access expressions undergo implicit unary numeric promotion, which will widen an expression to int
.
The index expression undergoes unary numeric promotion (§5.6.1).
The char
datatype is widened to int
via its Unicode value, e.g. 'A'
-> 65
.
Related Topics
Why Does String.Split Need Pipe Delimiter to Be Escaped
Explicit Casting from Super Class to Subclass
How Is an Overloaded Method Chosen When a Parameter Is the Literal Null Value
What Is the Use of Interface Constants
Cannot Parse String in Iso 8601 Format, Lacking Colon in Offset, to Java 8 Date
Returning Null as an Int Permitted with Ternary Operator But Not If Statement
Effective Gif/Image Color Quantization
Swingpropertychangesupport to Dynamically Update Jtextarea
Maven Modules + Building a Single Specific Module
How to Attach Source in Eclipse
What Is the Meaning of the Cascadetype.All for a @Manytoone JPA Association
Parse JSON from Httpurlconnection Object
Java: Syntax and Meaning Behind "[B@1Ef9157"? Binary/Address