質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.42%

  • Java

    14757questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

int char キャスト

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,790

BitCoin

score 45

intとcharについて質問です。
下のように
int型にcharを入れる場合はキャストしなくてよいのに
char型にintを入れる際にキャストをしなければいけないのはなぜでしょうか?

またなぜcharにintを入れると"a"のunicode番号0x97が入り
intをcharにキャストすると0x97のunicode番号の値がかえるのでしょうか?
なぜこのような仕様にしたのでしょうか?

            int aaa = 1 ;
            char char1 = 'a';
            aaa = char1 ;
            char1 = (char)aaa;
            System.out.println("int char"+aaa+char1);
///int char97a
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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仮想マシンの仕様としてそのように定義されているかまでは調べていないのですぐにはわかりませんでした。

画面表示の様子を下記のように試してみましたので、ご参考まで記載します。

$ jshell 
10月 21, 2017 9:45:22 午前 java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.

|  JShellへようこそ -- バージョン9
|  概要については、次を入力してください: /help intro

jshell> 'a'
$1 ==> 'a'

jshell> 0x61
$2 ==> 97

jshell> (char)0x61
$3 ==> 'a'

jshell> (int)'a'
$4 ==> 97

jshell> "abc".toCharArray()
$5 ==> char[3] { 'a', 'b', 'c' }

jshell> (char)12345
$6 ==> '〹'

jshell> (char)55555
$7 ==> '?'

jshell> 

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/20 22:19

    回答ありがとうございます。
    「Javaではintは数値を、charは1文字を表すために利用されるため、画面表示時の仕様として質問に記載の動作としているものと思われます。」
    この意味なのですがもう少し詳しく説明していただいてもよろしいでしょうか?

    キャンセル

+1

intは32ビット整数、charは16ビット整数です。
int←charは16ビットの数値を32ビットの箱に入れるワイドニング変換のため問題ないのですが、
char←intは32ビットの数値を16ビットの箱に入れようとするナローイング変換のため、情報が失われる恐れがあります。
こういう変換はJavaにおいては勝手にはできませんので、キャスト演算子を使うことになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/21 23:14

    回答ありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.42%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14757questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。