原文:
If you are converting from a byte value b to a char and you don’t want sign
extension, you must use a bit mask to suppress it. This is a common idiom, so no
comment is necessary:
char c = (char) (b & 0xff);
没有get到 sign extension的含义!以及为什么这么做就没有sign extension
まず、char には 16 ビット バイトと 8 ビット バイトがあります。直接シフトを実行すると、負のバイトは最初の符号ビット 1 に従って直接展開されます。 111111111xxxxxx になる場合は、ビット単位の AND を実行すると、この問題は発生しません。
それがシンボルビットであることは理解しています
long 型を除く他の型はビット演算を実行するときに、符号拡張を必要としないため、char に変換するビットに一致するバイトの最初のビットが使用されません。 Java には unsigned 型はなく、char の範囲は -2^16-2^16-1 です。char は 2 バイト (たとえば、byte b=-1)、最初のビットは符号ビット char c= として使用されます。 (char)b の場合、c バイナリ ビット (補数) は 1111 1111 1111 1111 と表されます。つまり、最初のビットが符号ビットとして使用されない場合は 2 バイトが -1 を表します (char c=(char)。 )(b&0xff) の場合、c の 2 進ビット (補数) は 0000 0000 1111 1111 として表されます。つまり 255 で、2 文字のバイトは 255 を表します。