以下のコードは、Javaバイト値として16進数として格納されている数値を、符号付きおよび符号なしの表現で表示します。それは正しい言い回しではないかもしれません。つまり、これらの数値はCスタイルの1バイトのunsignedchar値である可能性があります。これらの値を解釈している場合(ここではJavaですが、任意の言語で任意の符号付きタイプを使用できます)、「数値」が符号ビットの使用にオーバーフローすると、数値は負になります。ただし、0xFFとAND演算を行うことで、符号なしの解釈で表示されるように印刷できます。
ANDがどのように機能するかは理解していますが、ANDが署名されていないものとしてどのように表示されるかを理解できません。誰か説明してもらえますか?
public class understand_casting {
public static String printbinary(byte val) {
int displayMask = 1 << 7;
String str = new String();
for(int bit = 1; bit <= 8; ++bit) {
str += (val & displayMask) == 0 ? '0' : '1';
val <<= 1; //shift one to left
}
return str;
}
public static void main(String[] args) {
System.out.printf("0x50=%s, as int=%d, as unsigned int=%d\n", printbinary((byte)0x50), (byte)0x50, ((byte)0x50 & 0xFF));
System.out.printf("0x88=%s, as int=%d, as unsigned int=%d\n", printbinary((byte)0x88),(byte)0x88, ((byte)0x88 & 0xFF));
System.out.printf("0x3E=%s, as int=%d, as unsigned int=%d\n", printbinary((byte)0x3E),(byte)0x3E, ((byte)0x3E & 0xFF));
System.out.printf("0xB7=%s, as int=%d, as unsigned int=%d\n", printbinary((byte)0xB7), (byte)0xB7, ((byte)0xB7 & 0xFF));
}
}
私はこの出力を取得します:
0x50=01010000, as int=80, as unsigned int=80
0x88=10001000, as int=-120, as unsigned int=136
0x3E=00111110, as int=62, as unsigned int=62
0xB7=10110111, as int=-73, as unsigned int=183