byte、short、intが署名されているので、Javaのbyteとshortはなぜ通常のsigned two's complementの処理を受けませんか?例えば、0xffはバイトでは不正です。バイトは2の補数に符号付きではありませんか?
これは、hereより前に説明しましたが、なぜこのような理由が見つかりませんでしたか。
byte、short、intが署名されているので、Javaのbyteとshortはなぜ通常のsigned two's complementの処理を受けませんか?例えば、0xffはバイトでは不正です。バイトは2の補数に符号付きではありませんか?
これは、hereより前に説明しましたが、なぜこのような理由が見つかりませんでしたか。
-1
を符号付きバイトに格納する実際のメモリを見ると、それは0xff
であることがわかります。しかし、バイナリ表現ではなく言語そのものでは、0xff
は単にバイトの範囲外です。 -1
のバイナリ表現は実際には2の補数を使用しますが、その実装の詳細から保護されています。
言語設計者は、-128から127までしか保持できないデータ型に255を格納しようとすると、エラーと見なされるという考えを単純に取り入れました。
Javaができますなぜあなたはコメントで尋ねる:
int i = 0xffffffff;
リテラル0xffffffff
リテラルint
で、2の補数を使用して解釈されます。あなたが1バイトのために似たようなことをすることができない理由は、リテラルがタイプbyte
、あるいは実際にshort
であることを指定する構文を言語が提供しないからです。
これ以上のリテラルタイプを提供しないという決定がなされた理由はわかりません。私はそれが単純さの理由から作られたと思います。言語の目標の1つは、不必要な複雑さを避けることでした。
これは合法ですが、範囲外であるため明示的にバイトにキャストする必要があります。つまり、(byte)0xffです。
-128から127
からbyte
範囲の可能な値範囲外の値が変数に代入させ、そして静かにオーバーフローを捨てることが可能であろうが、それはむしろ混乱することになります慣習的なものよりも。
その後、我々は持っているでしょう:ほとんどの状況で
byte b = 128;
if (b < 0) {
// yes, the value magically changed from 128 to -128...
}
を、それはコンパイラは値がそのようにそれを「修正」するよりも、範囲外であることを教えてくれていた方がよいでしょう。
あなたは
int i = 0xFFFFFFFF;
を書くことができますが、あなたは0xFFではないbyte
int
値であるように定義する方法は255への等しいありません
byte b = 0xFF;
を書き込むことはできませんバイトまたは短いリテラルなので、キャストする必要があります。
ところであなたも
byte b = 30;
b *= 1.75; // b = 52.
ありがとうございます。私は最近+ =の暗黙のキャストを知りました。 Javaでは、私は0xffがintであることに同意します。それが現実さ。しかし、一般に0xffは8ビットに符号が付けられているため、バイトに割り当てることができます。とにかく私は質問に答えていると思う - バイトは2の補完として実装されています。 – Sridhar
0xFFは、バイトリテラルタイプがないため、255だけしか欠落します。キャストのないバイトである0xFFを書き込む方法はありません。 c.f. '0xFFL'は' long'です –
あなたは正しいです。しかし、あなたはそれを書くことができます。 I.バイトb =(バイト)0xFF;もちろんそれは-1でも失敗します:-) –
あなたは文字通りバイトを設定することができますが、驚くほど、あなたはより多くの数字を使用する必要が
byte b = 0;
b += 0xFF;
b ^= 0xFF;
を行うことができます。
byte bad = 0xff; // doesn't work
byte b = 0xffffffff; // fine
ロジックがあります0xffは暗黙的に0x000000ffであり、これはバイトの範囲を超えています。 (255)
これは最初の考えではありませんが、ロジックがあります。数値が大きいほど数値が小さくなり(絶対値が小さくなります)。
byte b = 0xffffffff; // -1
byte c = 0xffffff81; // -127
byte c = 0xffffff80; // -128
実装が2の補完であることを知っていただきありがとうございます。なぜ、その言語はintに対して0xffff_ffffを許していますか? – Sridhar