首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java 8和Java 9中使用未签名的整数?

如何在Java 8和Java 9中使用未签名的整数?
EN

Stack Overflow用户
提问于 2018-03-19 00:22:03
回答 2查看 0关注 0票数 0

在Oracle“原始数据类型”中,它提到Java 8增加了对未签名的INT和LONG的支持:

int*默认情况下,int数据类型是一个32位有符号的双补体整数,其最小值为-231,最大值为231-1。在JavaSE 8及更高版本中,可以使用int数据类型表示无符号32位整数,其最小值为0,最大值为232-1。使用Integer类要使用的int数据类型为无符号整数。有关更多信息,请参见数字类一节。静态方法,如compareUnsigned,,,divideUnsigned等已添加到Integer类以支持无符号整数的算术操作。long*long数据类型是64位2的补体整数.。签名long最低数值为-263,最大值为263-1。在JavaSE 8及更高版本中,可以使用long数据类型来表示无符号64位。long**,它的最小值为0,最大值为264-1。**当您需要比int提供的值范围更宽时,请使用此数据类型。大Long类还包含以下方法:compareUnsigned,,,divideUnsignedETC支持无符号算术运算long...

但是,我没有办法声明一个无符号的长或整数。例如,以下代码给出了一个编译器错误消息“文字超出了范围”(当然,我使用的是Java 8),当它应该在范围内时(赋值精确为264-1):

代码语言:txt
复制
public class Foo {
    static long values = 18446744073709551615L;

    public static void main(String[] args){
        System.out.println(values);
    }  
}

那么,是否有任何方法来声明一个未签名的int或long?

EN

回答 2

Stack Overflow用户

发布于 2018-03-19 08:40:03

根据你发布的文件这篇博客文章-在声明无符号int/long和已签名int/long之间的原语时,没有任何区别。“新支持”是在Integer和Long类中添加静态方法。Integer.divideUnSigned...。如果不使用这些方法,那么在2^63-1以上的“无符号”Long只是一个带负值的普通的旧Long。

从快速浏览来看,似乎没有办法在+/-2^31-1或+/-2^63-1以外的范围内声明整数常量。必须手动计算与超出范围的正值对应的负值。

票数 0
EN

Stack Overflow用户

发布于 2018-03-19 09:41:18

嗯,即使在Java 8中,longint还在签名,只有一些方法把他们当作没有签名的人对待...。如果你想写没有签名的long字面上如此,你可以做到

代码语言:txt
复制
static long values = Long.parseUnsignedLong("18446744073709551615");

public static void main(String[] args) {
    System.out.println(values); // -1
    System.out.println(Long.toUnsignedString(values)); // 18446744073709551615
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档