在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
,,,divideUnsigned
ETC支持无符号算术运算long
...
但是,我没有办法声明一个无符号的长或整数。例如,以下代码给出了一个编译器错误消息“文字超出了范围”(当然,我使用的是Java 8),当它应该在范围内时(赋值精确为264-1):
public class Foo {
static long values = 18446744073709551615L;
public static void main(String[] args){
System.out.println(values);
}
}
那么,是否有任何方法来声明一个未签名的int或long?
发布于 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以外的范围内声明整数常量。必须手动计算与超出范围的正值对应的负值。
发布于 2018-03-19 09:41:18
嗯,即使在Java 8中,long
和int
还在签名,只有一些方法把他们当作没有签名的人对待...。如果你想写没有签名的long
字面上如此,你可以做到
static long values = Long.parseUnsignedLong("18446744073709551615");
public static void main(String[] args) {
System.out.println(values); // -1
System.out.println(Long.toUnsignedString(values)); // 18446744073709551615
}
https://stackoverflow.com/questions/-100007662
复制相似问题