6

Kathy Sierra による SCJP ガイドの本では、課題の章で、このようなものを宣言できることを学びbyte b = 7;ます。舞台裏のコードはbyte b = (byte) 7;. これは、Java では、数値 7 がリテラル int 値と見なされるため、int にキャストする必要があるためです。

今他の状況。double は、より大きなデータ型であるため、float 値に含まれるすべてのバイトを含めることができます。10.543float f = 10.543;は非常に小さな値であり、フロート内に収まるはずです。また、そのような数値のリテラル値は Double と見なされるため、コンパイラは暗黙的に float にキャストする必要があります。しかし、そうではありません。コンパイラが私たちを止めます。その値の後にForを追加する必要があります。f

リテラル値の割り当てで、これら 2 つの競合する動作が存在するのはなぜですか? 要するに、byte b = 7可能であれば。なぜfloat f = 10.543できないのですか?

4

5 に答える 5

6

JLS5.2割り当て変換を読むことができます

定数のコンパイル時の絞り込みは、次のようなコードを意味します。

 byte theAnswer = 42;

許可されている。ナローイングがない場合、整数リテラル42がint型であるという事実は、バイトへのキャストが必要になることを意味します。

byte theAnswer = (byte)42;  // cast is permitted but not required

式のタイプが、割り当てコンテキストで許可されている変換によって変数のタイプに変換できない場合、コンパイル時エラーが発生します。

変数のタイプがfloatまたはdoubleの場合、値セット変換(§5.1.13)が値vに適用されます。

JLS#3.10.2。浮動小数点リテラル

浮動小数点リテラルは、ASCII文字のFまたはfが接尾辞として付いている場合、float型になります。それ以外の場合、そのタイプはdoubleであり、オプションでASCII文字Dまたはdの接尾辞を付けることができます。

5.1.2。プリミティブ変換の拡大

doubleからfloatへのナローイングプリミティブ変換は、IEEE 754丸め規則(§4.2.4)によって管理されます。この変換により、精度が失われる可能性がありますが、範囲も失われるため、非ゼロのdoubleからはfloatゼロになり、有限のdoubleからはfloat無限大になります。二重NaNは浮動小数点NaNに変換され、二重無限大は同じ符号の浮動小数点無限大に変換されます。

上記があなたの疑問を明らかにすることを願っています。

于 2012-09-14T07:02:07.993 に答える
3

前の回答に追加すると、10.543 の実際の表現は次のようになります。

実際には 2 つの異なる数値を指定しているため、明示的な宣言を要求することは理にかなっています。

于 2012-09-14T07:17:31.477 に答える
1

「舞台裏では、コードはバイトb =(バイト)7です」。

それは正しくありません。他のいくつかの回答で参照されているJLS#5.2を参照してください「変数の型がbyte、short、またはcharであり、定数式の値が変数の型で表現できる場合は、ナローイングプリミティブ変換を使用できます」と書かれています。

型キャストについては何もありません。

于 2012-09-14T10:13:02.903 に答える
1

フロートにdoubleを割り当てると、精度が低下する可能性があるため、Javaは、割り当てをどのように実行するかを明示的に指定する必要があることを通知します。単純な切り捨てにより、重大な丸め誤差が発生する可能性があります。

基数10の制限された小数は、実際には2進数(浮動小数点など)の無制限の小数値である可能性があることを考慮してください。したがって、浮動小数点型間の変換を明示的にすることは経験則であり、ほとんどの場合に役立ちます。

バイトのような整数型の場合、状況はわずかに異なります。整数型はサイズのみが異なる可能性がありますが、すべて同じ10進精度、つまりゼロです。したがって、より大きな積分型のフィッティング値をより小さな積分変数に割り当てることにあいまいさはありません。

于 2012-09-14T07:04:26.690 に答える
1

違い:

  • int から byte に「変換」しているときは、バイトを切り捨てているだけです
  • double から float に変換するとき、複雑で自明ではない操作を行っているため、暗黙的に行うことはできません
于 2012-09-14T06:58:14.813 に答える