遅すぎますが、JB Nizetによって提供されたソリューションが機能する理由が明らかになる可能性があるため、これについて私の意見を述べたいと思います。私はバイトパーサーで作業しているこの小さな問題に出会い、自分で文字列変換を行いました。このjava docによると、大きなサイズの整数型から小さなサイズの整数型にコピーすると、次のようになります。
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3
符号付き整数から整数型Tへのナローイング変換は、n個の最も低いものを除いてすべて破棄しますオーダービット。nはタイプTを表すために使用されるビット数です。数値の大きさに関する情報が失われる可能性に加えて、結果の値の符号が入力値の符号と異なる場合があります。 。
このjavaドキュメントがhttps://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
バイトを示しているので、バイトが整数型であることを確認でき
ます:バイトデータ型は8ビットの符号付き2補数の整数。
したがって、整数(32ビット)をバイト(8ビット)にキャストする場合、その整数の最後(最下位8ビット)を指定のバイト変数にコピーするだけです。
int a = 128;
byte b = (byte)a; // Last 8 bits gets copied
System.out.println(b); // -128
ストーリーの第2部では、Javaの単項演算子と二項演算子がオペランドをどのように昇格するかについて説明します。
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
拡大プリミティブ変換(§5.1.2)は、指定されたオペランドのいずれかまたは両方を変換するために適用されます次のルールによる:
どちらかのオペランドがdouble型の場合、もう一方はdoubleに変換されます。
それ以外の場合、一方のオペランドがfloat型であれば、もう一方はfloatに変換されます。
それ以外の場合、一方のオペランドがlong型であれば、もう一方はlongに変換されます。
それ以外の場合は、両方のオペランドがint型に変換されます。
整数型int以下を使用している場合は、intに昇格されますのでご安心ください。
// byte b(0x80) gets promoted to int (0xFF80) by the & operator and then
// 0xFF80 & 0xFF (0xFF translates to 0x00FF) bitwise operation yields
// 0x0080
a = b & 0xFF;
System.out.println(a); // 128
私もこれについて頭をかきました:) これについては、rgettmanが適切な答えを示しています。
整数とロングのみのJavaのビット単位演算子?