int型にcharを入れる場合はキャストしなくてよいのに
char型にintを入れる際にキャストをしなければいけないのはなぜでしょうか?
char型で取り得る値の範囲をint型は全て含んでいるためです。
逆にint型の値をchar型の数値とするためには範囲外の値を切り捨てる必要があります。
そのため、そのような切り捨て操作が行われることを許容することを明示するためにキャストを必要とします。
また、Javaではintは数値を、charは1文字を表すために利用されるため、文字列化する際の仕様として質問に記載の動作としているものと思われます。
また、'a'の文字コードとして表示されている97という数値は10進数での値です。
16進数表記では0x61となります。
追記:
char型は0から65535の範囲の値を扱うことができ、unsigned shortのような形でも利用できますが、本来の(と断言してよいかはわかりませんが)利用用途はJava内部で文字を扱う際のUCS-2というUnicode表現での1文字を表すことです。
そのため、その値を画面表示するために文字列化する場合、文字コードとして適切な値であれば、その文字として表示しようとする動きとした方が利便性がよいと思われます。
そのため、現在のJavaの実装では、文字列として扱おうとした場合に、char型は文字として扱われ、int型は数値として扱われることとしているものと考えます。
実際にJava仮想マシンの仕様としてそのように定義されているかまでは調べていないのですぐにはわかりませんでした。
画面表示の様子を下記のように試してみましたので、ご参考まで記載します。
bash
1$ jshell
210月 21, 2017 9:45:22 午前 java.util.prefs.FileSystemPreferences$1 run
3INFO: Created user preferences directory.
4
5| JShellへようこそ -- バージョン9
6| 概要については、次を入力してください: /help intro
7
8jshell> 'a'
9$1 ==> 'a'
10
11jshell> 0x61
12$2 ==> 97
13
14jshell> (char)0x61
15$3 ==> 'a'
16
17jshell> (int)'a'
18$4 ==> 97
19
20jshell> "abc".toCharArray()
21$5 ==> char[3] { 'a', 'b', 'c' }
22
23jshell> (char)12345
24$6 ==> '〹'
25
26jshell> (char)55555
27$7 ==> '?'
28
29jshell>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/20 13:19