如何在java [duplicate]中输出无符号整数的绝对值

问题描述 投票:8回答:3

这个问题在这里已有答案:

我想将4294967295分配给一个变量(2^32-1)显然我不能用Integer做到这一点,并且可以用Long来做。

但是,我注意到Java 8提供了无符号整数(至少某些方法)。

有没有人知道Integer.parseUnsignedInt()的方法是什么?当我输入"4294967295"并打印变量时,它输出为-1-24294967294-34294967293等等)

有没有办法让我仍然可以在变量中使用4294967295

我在这里错过了什么吗?

a=Integer.parseUnsignedInt("4294967295");
System.out.println(a);

这给出了-1的输出,但我期待4294967295

java int java-8 unsigned
3个回答
19
投票

您可以通过调用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) 

3
投票

据我了解https://blogs.oracle.com/darcy/entry/unsigned_api,未签名的支持不是通过引入新类型来完成的。这些值仍存储在(signed)int变量中,但它们提供了将值解释为unsigned的方法:

为了避免处理盒装值的开销并允许重用内置算术运算符,无符号API支持不会引入新的类型,如UnsignedInt和实例方法来执行加法,减法等。但是,缺少单独的Java -level无符号类型确实意味着程序员可能会意外地混合有符号和无符号值。

您使用了“unsigned”版本的parse,但是没有显示用于“打印变量”的方法。可能你选择了(默认)签名的。


0
投票

有没有办法让我在变量中仍然可以拥有4294967295?

是。使用long。 (对我来说,这听起来像是在推翻它。)

© www.soinside.com 2019 - 2024. All rights reserved.