为什么我不能将 signed int 转换为 unsigned long

Why can't I convert signed int to unsigned long

我正在从 Java 中的文件中读取数字数据:

一个字节长度的数据代表一个unsigned byte 两个字节长度的数据表示一个unsigned short 四个字节长度的数据表示一个unsigned int

但是因为 Java 7 没有无符号类型,我需要使用 short/integer 来表示字节值的整个范围, integer 代表一个短值,我假设 long 代表一个整数值。

但是我在表示整数值时遇到了问题

我有这三种方法:

 public class Utils 
 { 
    public static int u(short n)
    {
        return n & 0xffff;
    }


    public static int u(byte n)
    {
        return n & 0xff;
    }

     public static long u(int n)
    {
        return n & 0xffffffff;
    }
}

和三个测试用例,但只有前两个测试用例有效:

public void testByteToUnsignedIntConversion()
    {
        byte maxByte = (byte)0xff;
        int  maxNotConverted = maxByte;
        int  maxConverted    = Utils.u(maxByte);
        System.out.println(maxConverted + ":" + maxNotConverted);
        assertEquals(255,maxConverted);
    }

    public void testShortToUnsignedIntConversion()
    {
        short maxShort = (short)0xffff;
        int  maxNotConverted = maxShort;
        int  maxConverted    = Utils.u(maxShort);
        System.out.println(maxConverted + ":" + maxNotConverted);
        assertEquals(65535,maxConverted);
    }

    public void testIntToUnsignedLongConversion()
    {
        int maxInt = 0xffffffff;
        long  maxNotConverted = maxInt;
        long  maxConverted    = Utils.u(maxInt);
        System.out.println(maxConverted + ":" + maxNotConverted);
        assertEquals(4294967296l,maxConverted);
    }

我误会了什么?

Guava 没有自己动手,而是为无符号值提供了辅助方法 - UnsignedInts, UnsignedLongs etc (for more information, see their wiki), and there's built-in methods in Java 8 to use as well - parseUnsignedInt, divideUnsigned

按位和 (&) 将操作数作为整数处理,除非您另有说明。这就是为什么它与 byte 和 short 一起工作的原因,因为方法 return 是一个整数。因此,由于您希望结果是一个长值以将其作为无符号值处理,因此您应该使用整数最大值掩码(即 2^32-1 或 0xFFFFFFFF)并将其转换为长值。长常量在java中应该以L结尾,所以只要修改成如下:

public static long u(int n)
{
    return n & 0xffffffffL;
}

如果您需要的是对无符号值进行算术运算并且使用哪个版本的 java 并不重要,我建议使用 java 8 因为它有方法在 Long、Integer、Byte 和 Short 类 中执行此类无符号运算。