Java 向左移动位 byte right=0xf;//00001111 System.out.println(Integer.toBinaryString(右));//00001111 right=(byte)(right

Java 向左移动位 byte right=0xf;//00001111 System.out.println(Integer.toBinaryString(右));//00001111 right=(byte)(right,java,Java,如果您没有强制转换到byte,一切都会好起来 没有为byte定义移位运算符,因此该值首先提升为int——这很好,仍然是0000[…]1111 然后向左移位4位,得到0000[…]111000 然后将其转换为字节,得到字节11110000 然后调用Integer.toBinaryString,它接受一个int参数。这意味着字节1111000被转换为int——在这一点上,它的符号扩展到1111111111 0000(按照),然后被打印出来 选项: 不要向下转换到字节,这样你就不会返回到int(例如

如果您没有强制转换到
byte
,一切都会好起来

没有为
byte
定义移位运算符,因此该值首先提升为
int
——这很好,仍然是0000[…]1111

然后向左移位4位,得到0000[…]111000

然后将其转换为
字节
,得到字节11110000

然后调用
Integer.toBinaryString
,它接受一个
int
参数。这意味着字节1111000被转换为
int
——在这一点上,它的符号扩展到1111111111 0000(按照),然后被打印出来

选项:

  • 不要向下转换到
    字节
    ,这样你就不会返回到
    int
    (例如,使用
    int shift=right如果你没有转换到
    字节
    ,一切都会很好

    没有为
    byte
    定义移位运算符,因此该值首先提升为
    int
    ——这很好,仍然是0000[…]1111

    然后向左移位4位,得到0000[…]111000

    然后将其转换为
    字节
    ,得到字节11110000

    然后调用
    Integer.toBinaryString
    ,它接受一个
    int
    参数。这意味着字节1111000被转换为
    int
    ——在这一点上,它的符号扩展到1111111111 0000(按照),然后被打印出来

    选项:


    • 不要向下转换到
      byte
      ,这样就不会最终转换回
      int
      。(例如,使用
      int shift=right是的,您显式地将其转换为byte,然后隐式地将其转换回int。是的,后一步将其反写为one。是的,您显式地将其转换为byte,然后隐式地将其转换回int。是后一步将其反写为one。
      
          byte right =0xf; // 00001111
          System.out.println(Integer.toBinaryString(right)); // 00001111
      
          right = (byte)(right << 4);
          System.out.println(Integer.toBinaryString(right)); // 11111111111111111111111111110000