web-dev-qa-db-ja.com

Javaで整数はどのようにバイトにキャストされますか?

Javaは符号なし型を許可​​しないので、整数をバイトにキャストする方法を考えていました。値が255の整数aがあり、整数をaにキャストするとします。バイト。値はバイト11111111で表されますか?言い換えると、値は符号付き8ビット整数として扱われますか、それとも整数の最後の8ビットを直接コピーしますか?

20
LandonSchropp

これは ナローイングプリミティブ変換 と呼ばれます。仕様によると:

符号付き整数から整数型へのナロー変換[〜#〜] t [〜#〜]は、n最下位ビットを除くすべてを単純に破棄します。ここで、nは、型を表すために使用されるビット数です[〜#〜] t [〜#〜]。数値の大きさに関する情報が失われる可能性があることに加えて、これにより、結果の値の符号が入力値の符号と異なる場合があります。

したがって、これはリストした2番目のオプションです(最後の8ビットを直接コピーします)。

符号付き整数値がどのように表されるかを知っているかどうかはわかりません。念のため、バイト値1111 1111は の-1に等しいことを指摘します。 2の補数 システム(Javaが使用)。

23
Michael Myers

または、整数の最後の8ビットを直接コピーするだけですか

はい、これがこのキャスティングの仕組みです

4
Roman
int i = 255;

byte b = (byte)i;

したがって、16進数のbeの値は0xFFですが、10進数の値は-1になります。

int i = 0xff00;

byte b = (byte)i;

Bの値は0x00になりました。これは、Javaが整数の最後のバイト、つまり最後の8ビットを取るが、これは符号付きであることを示しています。

4
Paul

私の理解によると、あなたは

Integer i=new Integer(2);
byte b=i;   //will not work 

final int i=2;
byte b=i;   //fine 

やっと

Byte b=new Byte(2);
int a=b;   //fine
1
Sultan Khan

次のフラグメントは、intbyteにキャストします。整数の値がbyteの範囲よりも大きい場合、(整数を除算した余り)byteの範囲を法として縮小されます。

int a;
byte b;
// …
b = (byte) a;
1
MDIT

言われていることについての考え:xFF(intの場合)でバイトに変換するときは、常に整数をマスクしてください。 (myIntに0から255までの値が割り当てられていると仮定します)。

例えば.

char myByte = (char)(myInt & 0xFF);

どうして? myIntが255より大きい場合、バイトに型キャストするだけで、不要な負の値(2の補数)が返されます。

1
Buhake Sindi

バイトは8ビットです。 8ビットは256個の数値を表すことができます。(2を8 = 256に上げる)
最初のビットが符号に使用されるようになりました。 [正の場合は最初のビット= 0、負の場合は最初のビット= 1]
整数1099をバイトに変換するとします。 1099を256で割るだけです。余りはintのバイト表現です。

1099/256 =>余り= 75
-1099/256 =>剰余= -75
2049/256 =>余り= 1
理由は?この画像を見てください http://i.stack.imgur.com/FYwqr.png

1
Manish Sakariya
for (int i=0; i <= 255; i++) {
    byte b = (byte) i;    // cast int values 0 to 255 to corresponding byte values 
    int neg = b;     // neg will take on values 0..127, -128, -127, ..., -1
    int pos = (int) (b & 0xFF);  // pos will take on values 0..255
}

127より大きい値(つまり、値0x80から0xFF)を含むバイトをintに変換すると、バイト値の上位ビット(つまり、ビット0x80)が符号拡張されます。 '余分な' 1ビットを削除するには、x&0xFF;を使用します。これにより、0x80より高いビット(つまり、ビット0x100、0x200、0x400、...)が強制的にゼロになりますが、下位8ビットはそのままになります。

これらを書くこともできます。それらはすべて同等です:int pos =((int)b)&0xFF; //最初にbをintに変換してから、上位ビットを削除しますint pos = b&0xFF; // int算術として実行-キャストは必要ありません

Javaは、算術演算を行うときに、サイズ(ビット数)がintよりも小さい整数型をint値に自動的に「プロモート」します。これは、より決定論的な結果を提供するために行われます(Cは、仕様の制約が少ないと言うよりも)。

'short'のキャストに関する この質問をご覧ください。

0
Art Swri