2012-05-03 12 views

答えて

4

-1を符号付きバイトに格納する実際のメモリを見ると、それは0xffであることがわかります。しかし、バイナリ表現ではなく言語そのものでは、0xffは単にバイトの範囲外です。 -1のバイナリ表現は実際には2の補数を使用しますが、その実装の詳細から保護されています。

言語設計者は、-128から127までしか保持できないデータ型に255を格納しようとすると、エラーと見なされるという考えを単純に取り入れました。

Javaができますなぜあなたはコメントで尋ねる:

int i = 0xffffffff; 

リテラル0xffffffffリテラルintで、2の補数を使用して解釈されます。あなたが1バイトのために似たようなことをすることができない理由は、リテラルがタイプbyte、あるいは実際にshortであることを指定する構文を言語が提供しないからです。

これ以上のリテラルタイプを提供しないという決定がなされた理由はわかりません。私はそれが単純さの理由から作られたと思います。言語の目標の1つは、不必要な複雑さを避けることでした。

+0

実装が2の補完であることを知っていただきありがとうございます。なぜ、その言語はintに対して0xffff_ffffを許していますか? – Sridhar

1

これは合法ですが、範囲外であるため明示的にバイトにキャストする必要があります。つまり、(byte)0xffです。

0

-128から127

からbyte範囲の可能な値範囲外の値が変数に代入させ、そして静かにオーバーフローを捨てることが可能であろうが、それはむしろ混乱することになります慣習的なものよりも。

その後、我々は持っているでしょう:ほとんどの状況で

byte b = 128; 
if (b < 0) { 
    // yes, the value magically changed from 128 to -128... 
} 

を、それはコンパイラは値がそのようにそれを「修正」するよりも、範囲外であることを教えてくれていた方がよいでしょう。

4

あなたは

int i = 0xFFFFFFFF; 

を書くことができますが、あなたは0xFFではないbyteint値であるように定義する方法は255への等しいありません

byte b = 0xFF; 

を書き込むことはできませんバイトまたは短いリテラルなので、キャストする必要があります。

ところであなたも

byte b = 30; 
b *= 1.75; // b = 52. 
+0

ありがとうございます。私は最近+ =の暗黙のキャストを知りました。 Javaでは、私は0xffがintであることに同意します。それが現実さ。しかし、一般に0xffは8ビットに符号が付けられているため、バイトに割り当てることができます。とにかく私は質問に答えていると思う - バイトは2の補完として実装されています。 – Sridhar

+0

0xFFは、バイトリテラルタイプがないため、255だけしか欠落します。キャストのないバイトである0xFFを書き込む方法はありません。 c.f. '0xFFL'は' long'です –

+0

あなたは正しいです。しかし、あなたはそれを書くことができます。 I.バイトb =(バイト)0xFF;もちろんそれは-1でも失敗します:-) –

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 
関連する問題