1

次のコード (これは単純化されたバージョンです) は、jdk1.6 では正常に実行されていましたが、jdk 1.7 ではアサーションが失敗します。

ByteBuffer buffer = ...;
buffer.mark();
char c = (char) buffer.get();
buffer.reset();

switch(c) {
  ...
  case 'H':
    byte b = buffer.get(); 
    //Here I get -106 for b and 72 for (byte) c
    assert( b == ((byte) c) );
    break;
  ...
}

オラクルの互換性ページを読みましたが、それを説明するものは何も見つかりませんでした。utf8 の 5 および 6 形式かもしれませんが、そうではないと思います。まだ調査中の競合状態である可能性もありますが、stackoverflowに問い合わせても問題ないと思いました:-)

4

3 に答える 3

1

byte の値の範囲は -128 ~ +127 (符号付き 8 ビット) です。char の値の範囲は 0 ~ +65535 (符号なし 16 ビット) です。「c」を char にキャストしないと機能します。

于 2013-05-16T14:52:35.187 に答える
0

はい、可能です。文字の範囲は 0 ~ 65535、バイトの範囲は -128 ~ 127 です。

0 未満のバイトを char にキャストすると、間違ったデータが得られます

そして、-128 から 127 までをバイトにキャストすると、間違った値が得られます

于 2013-05-16T14:58:27.503 に答える