为什么我不能将 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 类 中执行此类无符号运算。
我正在从 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 类 中执行此类无符号运算。