Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

型変換について

初めまして。
今月からjavaの勉強を始めました。
独習Javaで学習をしているのですが理解できているのか分からないため、
おそらく初歩的なものとは思いますが、質問をさせてください。


以下が問題のプログラムです。(独習Java P.27)
class AssignmentProblem{
  public static void main(String args[]){
    byte b1=1;
    byte b2=2;
    byte b3=b1*b2;
    System.out.println(b3);
  }
}

教本に書いてある内容ですが、
・byte b3=b1*b2; のステートメントに問題がありコンパイル出来ない
・エラーは代入ステートメントの右辺が自動的にint型に拡張される為に起
こる
・このステートメントを正常にコンパイルするためには、右辺の結果をbyte
型に変換する必要がある

上記を見て、
  byte b3=(byte)b1*b2
とまず型変換を試みたのですが、以下のエラーが出てしまいました。

精度が落ちている可能性
検出地:int
期待値:byte
   byte b3=(byte)b1*b2
エラー 1個

右辺をbyteじゃなくてintの字面にすればいけるのかしら…
  byte b1=1;
  byte b2=2;
  int i=b1*b2;
  byte b3=(byte)i;
  System.out.println(b3);
と上記の内容で試みたら、コンパイルに成功。
出力も2と出ました。

この内容で「右辺の結果をbyte型に変換」が出来た、ということでしょう
か。
誤りや、別の解答があれば教えて頂けるとありがたいです。

よろしくお願い致します。

8

回答

6084

閲覧

8件の回答

評価

0

実質的には同じことだが、意図されている書き方とは違う気がする。

ここのページにもあるが(ここは掲示板だけでなく、Javaの初歩的な情報も扱って
いる)、演算子の優先順位を覚える必要がある。

足し算と掛け算の三項式では順番を問わず掛け算が先、というやつだ。
足し算を先にしたいならどう書くか、というのも込みで、小学校でやったことの延
長。

ところで、そもそもbyteにしないといけない理由は、理解できているんだろうか。

評価

0

byte b3 = (byte)(b1*b2);

評価

0

匿名氏に先を越されたか。

変数のキャストも演算のひとつ。
優先順位があるってこと。

>byte b3=(byte)b1*b2

これは、書き替えたら

byte b3=((byte)b1)*b2

であって、最初と変わらないってこと。

評価

0

$さん、匿名さん、不良社員さん
レスありがとうございます!

まず、大きな勘違いをしておりました。
(byte)を右辺に置けばいいというものではなく、
(byte)を右辺全部に掛け算しなければいけないということだったのですね。
それを踏まえて、匿名さんと不良社員さんのレス内容も飲み込むことが出来ました。

演算子の優先順位については、理解していたつもりです。
10-2*5=0
(10-2)*5=40
といったようなことですよね。
お恥ずかしいことに、結びつけられていなかったというか、
根本的な理解不足だったようです。
java基本のページは、学習している部分を質問前に読んでおりました。


$さんからの
「そもそもbyteにしないといけない理由」ですが、
・代入ステートメントの右辺が自動的にint型に拡張される
・int型はbyte型よりも大きい
・左辺の型が右辺の型よりも小さい場合にはエラーが出てしまう
という捉え方をしていたのですが、これではbyteにしなければいけない理由にはなりませんよね…

「2.基本型の型変換とキャスト」の
byte型の変数は8バイトまでしかデータを格納することができません。8バイトを超えるデータは切り捨てられます(データの溢れ)。
というところは理由になるんでしょうか。

能動的に勉強をしたい半面、どこが足りないのかが理解できていない状況で、申し訳ないです。
byte変換の理由についてのヒントを、頂けるとありがたいです。

評価

30

>掛け算しなければいけない
掛け算ではないが、それはまあいい。

>演算子の優先順位については、理解していたつもりです。
キャストが演算のひとつであるという理解がなかったから、優先順位の話に結びつ
けられなかったのかな。
自分が分からないのはどこか、いきなりピンポイントで把握できることは多くない
だろう。
ここに限らないが、質問の場は答えを得る場所ではなく、考え方や要点を得る場
所。
その意味では、今回は(答えは書かれているが)とくに恥ずかしいことはない。

>これではbyteにしなければいけない理由にはなりませんよね…
Javaは、様々な先行言語が内包する欠点、問題点を洗った上で作られた。
今回のエラーと同様のものがバグの原因だったことが過去にたくさんあり、それな
ら最初から、明示的にキャストさせるようにしよう、という話。
ある程度のプログラマなら「エラーを消すために」キャストすることはないだろ
う。

>byte型の変数は8バイトまでしかデータを格納することができません。
管理人さん、説明が間違ってる。

評価

0

>byte型の変数は8バイトまでしかデータを格納することができません。
byte型は8bitで10進数の整数。
格納できる値の範囲は、符号付きで、-128〜127までです。

評価

0

>byte型の変数は8バイトまでしかデータを格納することができません。
管理人さん、説明が間違ってる。

修正しました。

評価

0

確認とレスが遅くなってしまい、申し訳ありません。
風邪をこじらせてしまっておりました…
皆様も、体調には気をつけて、ご自愛ください。

■$さん
>掛け算
イメージのまま文章にしてしまっていました…。

>キャストが演算のひとつであるという理解がなかったから、優先順位の話に結びつ
けられなかったのかな。
そういうことになるかと思います。
恥ずかしいと思っていたことに対して、ご指摘、というかフォローをありがとうございます。
考えた上でアドバイスを頂き、学んでいきたいと思います。

>Javaは、様々な先行言語が内包する欠点、問題点を洗った上で作られた。
>今回のエラーと同様のものがバグの原因だったことが過去にたくさんあり、それな
>ら最初から、明示的にキャストさせるようにしよう、という話。
>ある程度のプログラマなら「エラーを消すために」キャストすることはないだろ
>う。
つまり、Java基本で書かれている
「キャストとはプログラマが意識的に行う変換処理です。型変換では変数の変換処理を行えない場合に、キャストを使用します。キャストは変換したい型を( )で囲み、変換元の変数の前に指定することにより行います。」
ということでしょうか。
ある程度に至っていないプログラマの保険のようなイメージで、コメントを捉えたのですが。

■匿名さん
説明ありがとうございます。
バイトではなくbitでした…!

■javawoadさん
修正ありがとうございます。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。