[英]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
等(有关更多信息,请参见其wiki ),并且Java 8中也有内置方法可以使用parseUnsignedInt
, divideUnsigned
等
除非另有说明,否则按位和(&)将操作数作为整数处理。 这就是为什么它使用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.