Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么一个数字的ANDing在有符号和无符号表示之间转换?_Java_Unsigned_Signed - Fatal编程技术网

Java 为什么一个数字的ANDing在有符号和无符号表示之间转换?

Java 为什么一个数字的ANDing在有符号和无符号表示之间转换?,java,unsigned,signed,Java,Unsigned,Signed,下面的代码以十六进制形式显示存储为Java字节值的数字,并以有符号和无符号表示。这可能不是正确的措辞。我的意思是,这些数字可以是C风格的1字节无符号字符值。如果我解释这些值(这里正好是Java,但可以使用任何语言中的任何有符号类型),那么如果“数字”溢出到使用符号位,那么数字将显示为负数。但我可以通过与0xFF进行ANDing来打印未签名解释中显示的内容 我了解如何和如何工作,但我不明白安定如何表现为未签名。有人能解释一下吗 public class understand_casting {

下面的代码以十六进制形式显示存储为Java字节值的数字,并以有符号和无符号表示。这可能不是正确的措辞。我的意思是,这些数字可以是C风格的1字节无符号字符值。如果我解释这些值(这里正好是Java,但可以使用任何语言中的任何有符号类型),那么如果“数字”溢出到使用符号位,那么数字将显示为负数。但我可以通过与0xFF进行ANDing来打印未签名解释中显示的内容

我了解如何和如何工作,但我不明白安定如何表现为未签名。有人能解释一下吗

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));   
  }
}

将一个字节与int第一个符号进行and运算,将该字节扩展为int,然后发生and

这意味着,在这种情况下,字节被转换为具有符号扩展的整数,但随后选择了to和with的值,从而屏蔽了扩展符号位


因此,结果就好像是零扩展了字节。

正如您可能期望的那样,
int
1的二进制是

0000 0000 0000 0000 0000 0000 0000 0001
根据twos补码,您可以通过将一个数字反转并加上1来求反,因此twos补码中有符号的
int
-1的二进制值如下所示

1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 0000 0001
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
任何负数都将设置高位,而任何正数都将设置高位零

例如,0xff看起来像,左边有一个长字符串0

0000 0000 0000 0000 0000 0000 1111 1111
而-0xff看起来像

1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 0000 0001
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
当您使用
&
屏蔽时,只保留两者中存在的1位,因此-2&0xff看起来像

1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 1111 1111 1111 1111 0000 0001
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

与正值进行ANDing产生正值,因为结果高位始终为0。

OK。通过不求和,我想它就是int val=-1;这是否定的。@user619818,我不知道你指的是哪个“it”。