这个问题在这里已有答案:
我想将4294967295
分配给一个变量(2^32-1
)显然我不能用Integer
做到这一点,并且可以用Long
来做。
但是,我注意到Java 8提供了无符号整数(至少某些方法)。
有没有人知道Integer.parseUnsignedInt()
的方法是什么?当我输入"4294967295"
并打印变量时,它输出为-1
(-2
为4294967294
,-3
为4294967293
等等)
有没有办法让我仍然可以在变量中使用4294967295
?
我在这里错过了什么吗?
a=Integer.parseUnsignedInt("4294967295");
System.out.println(a);
这给出了-1
的输出,但我期待4294967295
。
您可以通过调用toUnsignedString()
将该整数视为unsigned int:
int uint = Integer.parseUnsignedInt("4294967295");
System.out.println(Integer.toUnsignedString(uint));
您还可以调用其他一些将int解释为unsigned的方法。
例如 :
long l = Integer.toUnsignedLong(uint);
System.out.println(l); // will print 4294967295
int x = Integer.parseUnsignedInt("4294967295");
int y = 5;
int cmp1 = Integer.compareUnsigned(x,y); // interprets x as 4294967295 (x>y)
int cmp2 = Integer.compare(x,y); // interprets x as -1 (x<y)
据我了解https://blogs.oracle.com/darcy/entry/unsigned_api,未签名的支持不是通过引入新类型来完成的。这些值仍存储在(signed)int变量中,但它们提供了将值解释为unsigned的方法:
为了避免处理盒装值的开销并允许重用内置算术运算符,无符号API支持不会引入新的类型,如UnsignedInt和实例方法来执行加法,减法等。但是,缺少单独的Java -level无符号类型确实意味着程序员可能会意外地混合有符号和无符号值。
您使用了“unsigned”版本的parse,但是没有显示用于“打印变量”的方法。可能你选择了(默认)签名的。
有没有办法让我在变量中仍然可以拥有4294967295?
是。使用long
。 (对我来说,这听起来像是在推翻它。)