繁体   English   中英

为什么我不能将有符号的int转换为无符号的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不用自己动手,而是提供了用于无符号值的辅助方法UnsignedIntsUnsignedLongs等(有关更多信息,请参见其wiki ),并且Java 8中也有内置方法可以使用parseUnsignedIntdivideUnsigned

除非另有说明,否则按位和(&)将操作数作为整数处理。 这就是为什么它使用byte和short的原因,因为这些方法返回整数。 因此,由于您希望结果为长整型值以将其作为无符号值处理,因此您应该使用整数最大值掩码(即2 ^ 32-1或0xFFFFFFFF)并将其强制转换为长整型。 长常量在Java中应以L结尾,因此只需将其修改为以下内容:

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

如果您需要的是对无符号值进行算术运算,而与使用哪个版本的Java无关紧要,我建议使用Java 8,因为它在Long,Integer,Byte和Short类中都有方法可以进行这种无符号操作操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM