9

SE 7 Java では、値をバイナリ リテラルとして指定できます。ドキュメントによると、「バイト」は8ビットの情報を保持できるタイプで、値は-128から127です。

理由はわかりませんが、次のようにJavaでバイナリリテラルをバイトに割り当てようとすると、8ビットを定義できず、7ビットしか定義できません。

byte b = 0b000_0000;    //solves to the value 0
byte b1 = 0b000_0001;   //solves to the value 1
byte b3 = 0b000_0010;   //solves to the value 2
byte b4 = 0b000_0011;   //solves to the value 3     

これらの 7 ビットを使用して最後のいくつかの可能性に到達するまで、以下のように続けます。

byte b5 = 0b011_1111;   //solves to the value 63
byte b6 = 0b111_1111;   //solves to the value 127

負の数にしたい場合は、次のように先頭に - を追加する必要があります。

byte b7 = -0b111_1111;   //solves to the value -127

現在、私が抱えている問題の半分は、8 ビットのデータ型であると彼らが私に言っていることを説明するために、7 ビットしか使用していないことです。後半は、32ビットすべてを定義できる32ビットint型を使用しない限り、2の補数としてスレッド化されないように見えることです(「符号インジケータビット」が含まれます)。

今、範囲内の数字-128を表示する方法を検索すると、それ以上の説明なしにこのようにするように言われました:

byte b8 = 0b1111_1111_1111_1111_1111_1111_1000_0000;

最後の 8 ビット (1000 0000) は、8 ビットを使用した 2 の補数で -128 を表していることがはっきりとわかりますが、これ以上混乱することはなく、質問してみます。

  • 上記の 32 ビットの長さは 32 ビット (Java-) の int 値ではありませんか?
  • 32 ビット値を 8 ビット (java-) バイト型に割り当てることができるのはなぜですか?

または一般的に:なぜこのように割り当てる必要があるのですか?

これに関するリンク/情報は素晴らしいでしょう! お時間を割いてお読みいただき、また事前に追加情報をお寄せいただきありがとうございます。

よろしくヤン

4

1 に答える 1

9

Java仕様によると、

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1

すべての宣言 (b、b1、...、および b8) は、1 バイトに収まる場合でも、intリテラルを使用します。Java にはバイト リテラルはありません。int のみを使用してバイトを初期化できます。

私はいくつかのテストを行い、正常にbyte neg128 = -0b1000_0000;動作します。は 128 なので、その前に記号0b1000_0000を付けるだけです。これはまったく符号ビットではない-ことに注意してください(8 ビットのバイトについて考えないでください。バイトに変換された 32 ビットの整数について考えてください)。したがって、符号ビットを指定する場合は、実証したように 32 ビットすべてを書き込む必要があります。1

byte b8 = 0b1000_0000;エラーはエラーと同じです ( +128byte b8 = 128;は 1 バイトに収まりません)。キャストを使用して変換を強制することもできます。

byte b = (byte) 0b1000_0000; また byte b = (byte) 128;

キャストは、128 が 1 バイトに収まらず、ビットパターンが -128 として再解釈されることを知っていることをコンパイラに伝えます。

于 2013-09-19T16:34:39.187 に答える