

Javaのchar型からint型への変換で、どうしてその値に変わるのかが理解することができません。  
使用しているJREは、JREシステム・ライブラリー java11です。  
getNumericと-'0'は Java で char を int に変換するためによく使われる 2つのメソッドです。  
しかし、与えられた char が有効な桁を表していない場合でも、上記のメソッドはエラーを出さない、ということを検索して見つけました。  
その中で、私は『char が有効な桁を表していない場合でも、上記のメソッドはエラーを出さない』の件が理解することができません。  
そのため、どうして、以下のように変換しても、出力のch5からch8で、整数の65が出力されないのか、解説を付けて教えてください。

ソースコード

[code]

    class CharVariable {
        public static void main(String[] args) {
    
            //Aが出力される。
            char ch1 = 'A';
            char ch2 = 65;
    
            System.out.println("ch1 = " + ch1);
            System.out.println("ch2 = " + ch2);
    
            //Char型を65の整数に変換。その１
            char ch3 = 'A';
            char ch4 = 65;
    
            int convert3 = ch3;
            int convert4 = ch4;
    
            System.out.println("ch3 = " + convert3);
            System.out.println("ch4 = " + convert4);
    
            //Char型を65の整数に変換。その２
            char ch5 = 'A';
            char ch6 = 65;
    
            System.out.println("ch5 = " + Character.getNumericValue(ch5));
            System.out.println("ch6 = " + Character.getNumericValue(ch6));
    
            //Char型を65の整数に変換。その３
            char ch7 = 'A';
            char ch8 = 65;
    
            int convert7 = ch7 - '0';
            int convert8 = ch8 - '0';
    
            System.out.println("ch7 = " + convert7);
            System.out.println("ch8 = " + convert8);
        }
    
    }
    
[/code]

出力結果

[code]

    ch1 = A
    ch2 = A
    ch3 = 65
    ch4 = 65
    ch5 = 10
    ch6 = 10
    ch7 = 17
    ch8 = 17
    
[/code]


CC BY-SA 4.0
2022-08-11T04:02:28.263
90504
2022-08-11T08:58:56.167
2022-08-11T04:09:21.153
3060
41050
question
java
Javaのchar型からint型への変換方法でわからないところがあります。


[`Character.getNumericValue(char)`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/Character.html#getNumericValue\(char\)),
[`Character.getNumericValue(int)`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/Character.html#getNumericValue\(int\))
については、リンク先API仕様の通り、

> 文字A - Zの大文字(`'\u0041'` \- `'\u005A'`)、(中略) の各形式は、10 - 35の数値を持ちます。

なので、 `'A'` 及び `65` (= `0x41`) が `10` に変換されるのは、上記の仕様説明そのままの挙動です。

(一般的に、10より大きい基数で10以上の値を表すのにアルファベットが用いられます(例:
[16進数の場合](https://ja.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E9%80%B2%E6%B3%95))が、これはその用途に合わせた仕様のように思われます。)

なお、質問文中にある

> 『char が有効な桁を表していない場合でも、上記のメソッドはエラーを出さない』

というのはおそらく、上記リンク先にある

> 文字に数値が含まれていても値が非負の`int`値として表現できない場合は `-2`です。文字が数値を持たない場合は `-1`。

のことかと思いますが、今回の話とは無関係です。

* * *

次に、`'A' - '0'` が `17`
になる理由は、[Unicodeのコード一覧](https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF)を見れば良いです。  
`0` は `0x30`, `A` は `0x41` なのが分かるかと思います。  
つまり、

[code]

    'A' - '0'
    = 0x41 - 0x30
    = 0x11 
    = (10進数表現で) 17
    
[/code]

です。

* * *

`char` から `int` への型変換については、次のリンク先も見てみてください:

  * [なぜint型にchar型を代入してもコンパイルエラーにならないのか - スタック・オーバーフロー](https://ja.stackoverflow.com/a/41436/2808)


CC BY-SA 4.0
2022-08-11T08:58:56.167
90508
2022-08-11T08:58:56.167
2808
90504
answer