0

これは、4行目でコンパイルエラーが発生するプログラムです(精度が低下する可能性があります。必要なchar find int

public class test {
        public static void main(String args[]) {
            char c;
            int i;
            c = 'A';        // 1
                    char ch=32;       //2
            i = c;      //3
            c = i + 1;  //4
            c++;        //5
        }
    }

行番号で。2文字ch=32; char変数chに値32を割り当てますが、エラーは発生しません。この2行の違いが欲しいです。char ch=32およびc=i + 1;

4

8 に答える 8

5

エラーの理由は、それcharが 2 バイトであり、int4 バイトであるためです。また、Java では、変数が上位ビットを失うような暗黙のキャストを行うことはできません。intからへの明示的なキャストを行う必要がありcharます。
intに、「数値」ホルダーに値を割り当てると、範囲外のものを割り当てようとしなくなるまで機能します。(この場合は 2^16-1 以上)

于 2012-08-31T09:55:45.057 に答える
3

どちらの場合も、符号付き 32 ビットintから符号なし 16ビットへの変換を要求していますchar。この行で、コンパイラは数値 32 が に適合することを確認できますchar

char ch=32;

この行では、コンパイラは、int値を a に変換していることしか認識charしていないため、適合するかどうかはわかりません。

c = i + 1;

Java は、精度が失われないことが 100% 確実でない場合はいつでも、明示的なキャスト演算子を主張します。

于 2012-08-31T09:57:46.843 に答える
1

精度の損失は、INTEGER の値が大きく、CHAR の値が小さいことを意味するため、そのスペースに大きすぎるものを収めることはできません。

そのため、そのエラーが発生しています。

INTEGER を CHAR に型キャストする必要がありますが、INTEGER を CHAR に適合させることができないため精度は失われますが、整数値が損失精度よりも小さい場合は無視できます。

于 2012-08-31T09:59:16.550 に答える
1

変換とキャストを混同しないでください。この場合、キャストするだけです。一部の操作には暗黙的なキャストがあり、他の操作にはありません。たとえば=、そうではないので、キャストできるように指定しています。暗黙のキャスト++を行います。+=

例えば

char ch = '0';
char ch2 = 2; // implicit casting
ch *= 1.1; // implicit casting
ch2++; // no casting required. 
ch2 += 1; // implicit casting.
ch2 = ch2 + 1; // won't compile, casting required.
于 2012-08-31T09:59:56.110 に答える
0

私はあなたが何を望んでいるのか理解できません....しかし:

  • 2行目は、リテラル番号「32」を2バイトの文字で表すことができるため機能します
  • 4 バイトの値 (int) を 2 バイトの位置 (char) に割り当てようとすると、キャストが必要になるため、4 行目は失敗します。

さて、この種の char 演算を実行したいだけの場合は、次のことができます。

  • 'i' を char にします。
  • 4 行目にキャストを追加します。

2つのうちの1つは機能しますが、あなたが示すスニペットから、おそらく「i」をcharにする方が理にかなっています....

于 2012-08-31T10:00:36.110 に答える
0

これを使って:

c = (char) i + 1;

ただし、値iの範囲内にあることを確認してくださいchar

于 2012-08-31T09:55:23.960 に答える
0

Characterクラスで定義されているように、Java の char は文字の UTF-16 表現です。したがってchar、16ビットのサイズとして。

32最初の割り当てでは、16 ビットで格納できる を UTF-16 文字に割り当てているので、問題ありません。

しかし、あらゆる種類の int を as に変換しようとするとi、32 ビットのデータから 16 ビットのデータに変換されます。この操作は暗黙的ではありません。

short a = 32; // fine 
short b = 3243334; // can't compile
char c = 32; // fine
char d = 3243334; // can't compile
于 2012-08-31T09:57:31.823 に答える
0

その背後にある理由は、コンパイラがより高いデータ型の値をより低いデータ型の値に自動的に変換できないためです..

ここで int は上位データ型で、Char は下位データ型です...

i+1 は、char 型に収まらない整数の結果に評価されます。

データ型自動変換のイメージ

上下は不可

上下可能

于 2012-08-31T10:04:25.757 に答える