3

以下のコードは、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
4

2 に答える 2

8

ご想像のとおり、int1 のバイナリは

0000 0000 0000 0000 0000 0000 0000 0001

2 の補数によると、数値を反転して 1 を追加することで数値を否定するため、 2 のint補数の符号付き -1 のバイナリは次のようになります。

1111 1111 1111 1111 1111 1111 1111 1111

負の数には上位ビットが設定され、正の数には上位ビット 0 が設定されます。

たとえば、0xff は次のように見え、左側に 0 の長い文字列があります。

0000 0000 0000 0000 0000 0000 1111 1111

-0xff は次のようになります

1111 1111 1111 1111 1111 1111 0000 0001

を使用してマスクする&と、両方に存在する 1 ビットのみが保持されるため、-2 & 0xff は次のようになります。

1111 1111 1111 1111 1111 1111 1111 1110 |   -2
0000 0000 0000 0000 0000 0000 1111 1111 | 0xff

0000 0000 0000 0000 0000 0000 1111 1110 | -2 & 0xff = 0xfe

結果の上位ビットは常に 0 であるため、正の値との AND 演算は正の値を生成します。

于 2012-10-28T14:51:04.647 に答える
2

バイトと int の AND 演算では、最初にバイトが int に符号拡張され、次に AND が発生します。

つまり、この場合、バイトは符号拡張付きの int に変換されますが、AND の値は、拡張符号ビットがマスクされるように選択されています。

したがって、結果は、バイトをゼロ拡張したかのようになります。

于 2012-10-28T14:49:43.073 に答える