This works fine:
int foo = bar.charAt(1) - \'0\';
Yet this doesn\'t - because bar.charAt(x) returns a char:
int foo = bar.c
The following code works perfectly fine!
int foo = bar.charAt(1);
Similar to reference types, any Java primitive can be assigned without casting to another primitive of a type it is considered a subtype of. The subtyping rules for primitives are given by JLS section 4.10.1. char
is considered a subtype of int
, so any char
may be assigned to an int
.
Because in Java if you do not specify a type indicator with a number then it assumes Integer. What I mean by that, if you want to set a Long value, it would need to be 0L.
Performing a numerical operation on two different numerics, the result takes the larger. Hence, a char (which is a numerical value) minus an integer, results in an integer.
You will find that this works also
long val = bar.charAt(1) - 0L;
'0'
is a char too. It turns out, the characters in Java have a unicode (UTF-16) value. When you use the -
operator with characters Java performs the operation with the integer values.
For instance, int x = '0' - 'A';// x = 16
char
s are converted to int
implicitly:
public static void main(String [] args) throws Exception {
String bar = "abc";
int foo = bar.charAt(1) - '0';
int foob = bar.charAt(1);
System.err.println("foo = " + foo + " foob = " + foob);
}
output: foo = 50 foob = 98
.
Maybe you put two int foo ...
and this is because it didn't work?
This is an old ASCII trick which will work for any encoding that lines the digits '0' through '9' sequentially starting at '0'. In Ascii '0' is a character with value 0x30 and '9' is 0x39. Basically, i f you have a character that is a digit, subtracting '0' "converts" it to it's digit value.
I have to disagree with @Lukas Eder and suggest that it is a terrible trick; because the intent of this action aproaches to 0% obvious from code. If you are using Java and have String
that contains digits and you want to convert that String
to an int
I suggest that you use Integer.parseInt(yourString);
.
This technique has the benifit of being obvious to the future maintenance programmer.
Your second snipped should work fine though:
int foo = bar.charAt(1);
A char
, just like a short
or byte
, will always be silently cast to int
if needed.
This will compile just fine: int i = 'c';