Javaにおけるbyteタイプの初期化

1228 ワード

早いうちに仕事でJavaに少し触れたことがあるので、この穴ができて、今日振り返って自分がStackoverflowで提起した問題を見つけて、それを記録しました.
使用中はbyteタイプの各ビットを1にする必要があります.このような簡単な操作がJavaに様々な制約があるとは思わなかった.
まずコードを見てみましょう.
//    1
byte allBitsOne = 0xFF;
//   2
byte allBitsOne = (byte)0xFF; 
//   3
byte allBitsOne = 0xFFFFFFFF; 

上記のどの方式がbyteタイプの一人一人を1にする需要に達することができますか?答えは2,3です.
どうして方式1がいけないのですか.
Javaでは、整数字面量(literal integers)は、固定された符号付き32ビット整数で表されるからである.byteタイプはJavaではシンボル付きの8ビットタイプで、10進数-128~127を表す.したがって、0xFFが表す十進法255はbyteタイプの表現の範囲を超えている.
どうして方式2がいいですか.0xFFという32ビット整数型では、下位8ビットはいずれも1なので、今は(byte)で強制的に変換して、余分な高位を捨てて、残りの8ビットはすべて1のbyteで左に割り当てます.
どうして方式3でいいですか.
Javaでは、整数字面量(literal integers)は、固定された符号付き32ビット整数で表されるからである.さらに採用する補符号の形式では、0xFFFFFFFFに対してその表す数の絶対値が + 1であり、絶対値が1であることがわかり、最高位がシンボルビットであることから-1を表し、byteタイプによってJavaで-128~127を表すことができるので、付与することができ、-1はbyteタイプではそれぞれ1です.
穴は2つあると思います.
  • なぜbyteタイプはJavaでInt8ではなくUInt8に設計されるのですか?
  • Javaのタイプシステムはあまりにも柔軟ではありません.人のSwiftのliteral
  • を見てみましょう.