【问题标题】:How to output the absolute value of an Unsigned integer in java [duplicate]如何在java中输出无符号整数的绝对值[重复]
【发布时间】:2014-12-10 10:33:04
【问题描述】:

我想将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

【问题讨论】:

  • 向我们展示您创建 unsigned int 的代码
  • 不要把它看成一个十进制数把它看成一系列位,你是把一个无符号数变成有符号类型,如果你知道这个数的位表示是什么那么你知道你为什么得到 -2 或其他什么,然后将其解析为无符号以得到你期望的小数

标签: java int java-8 unsigned


【解决方案1】:

您可以通过调用toUnsignedString() 来将该整数视为无符号整数:

int uint = Integer.parseUnsignedInt("4294967295");
System.out.println(Integer.toUnsignedString(uint));

您还可以调用一些其他方法将该 int 解释为无符号。

例如:

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) 

【讨论】:

  • 请注意,这只适用于 Java 8 及更高版本。
【解决方案2】:

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

是的。使用long。 (对我来说,这听起来像是你想多了。)

【讨论】:

  • 我可以使用 long 但我发现 int 的执行速度比 long 快
【解决方案3】:

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

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

您使用了“无符号”版本的 parse,但没有显示您使用哪种方法来“打印变量”。可能您选择了(默认)签名的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2019-05-14
    相关资源
    最近更新 更多