有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中,为什么字节类型可以使用&0xff执行无符号右移操作?

我知道,在Java中,字节类型在进行右移操作之前,会首先转换为int类型

因此,在Java中,我们将得到字节类型的错误答案>>>;行动

比如

byte b=(byte)0xf1;
byte c=(byte)(b>>4);
byte d=(byte)(b>>>4);
byte e=(byte)((b&0xff)>>4);

d的答案等于c,但e的答案是正确的。我想不出原因

谢谢


共 (3) 个答案

  1. # 1 楼答案

    您自己回答了问题“在进行右移操作之前,将首先转换为int类型”,所以

    byte e=(byte)((b&0xff)>>4);
    

    首先

    b -> int => 0xfffffff1 
    

    然后

    0xfffffff1 & 0xff => 0xf1 
    

    然后

    0xf1 >> 4 => 0xf
    
  2. # 2 楼答案

    如前所述,Java总是使用int或更大的值进行计算,所以

    考虑^ {< CD2>}(注意上面的位被设置,所以^ {< CD3>}实际上是-15)

    隐式转换为int:
    (int)b = 1111 .... 1111 0001

    右移:
    (b>>4) = 1111 1111 .... 1111 1111
    (b>>>4) = 0000 1111 .... 1111 1111

    向布尔显式施放: c = d = 1111 1111


    考虑^ {CD8>}

    隐式转换为int:
    (int)b = 1111 .... .... 1111 0001

    使用0xff时:
    x&0xff = 0000 .... 0000 1111 0001

    右移:
    (b&0xff)>>4 = 0000 .... 0000 1111

    显式转换为字节:
    e = 0000 1111

  3. # 3 楼答案

    java中最小的类型是int,部分原因是现在CPU使用整数或更大的类型。 因此,JVM是基于int实现的,而其他较小的数据类型(如byte、char、boolean)只是为了方便而添加的

    所以,当你做比特运算时,你可以享受你提到的不一致性