java - java中为什么byte类型可以用&0xff做无符号右移操作?

标签 java byte

我知道,在Java中,byte类型在进行右移操作之前,会先转换成int类型。

所以在 Java 中,对于 byte 类型的 >>> 操作,我们会得到一个错误的答案。

例如,

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

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

谢谢

最佳答案

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

考虑 b = 1111 0001(注意最高位已设置,所以 b 实际上是 -15)

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

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

显式转换为 boolean 值: c = d = 1111 1111


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

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

与 0xff:
x&0xff = 0000 .... 0000 1111 0001

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

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

关于java - java中为什么byte类型可以用&0xff做无符号右移操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14759634/

相关文章:

java - Android 颜色选择器 - 更新颜色数组

java - 如何让一个循环再次做同样的事情?

Java将字节数组转换为UTF-8字符串

java - android java套接字写入和接收byte[]数据

Java:找出对象的内存大小?

java - 子类的对象创建是否创建父类(super class)的对象,如果是,是否可以在子类中访问它?

Java 二叉树 : How to balance a tree in the insert method?

java - 如何从IP地址获取最大主机数

c# - 使用 C# 获取字段的大小(以字节为单位)

Java 多维数组转字符串和字符串转数组