英文:
Is there an equivalent java constant for go's MaxUint64
问题
Java中是否有与go的常量MaxUint32相等的常量?因为我注意到MaxUint32
的值是4294967295,而Integer.MAX_VALUE
的值是它的两倍。
在Java中,等价于以下代码的常量是什么?
r := float64(stringHash(source)) / (float64(math.MaxUint32) + 1)
Java中的float和go中的float64有什么区别?
英文:
go has the constant MaxUint32, for insigned integers, but does Java have an equivalent constant? Cuz I noticed that MaxUint32
is 4294967295 and Integer.MAX_VALUE
is 2x that.
What would be the java equivalent of
r := float64(stringHash(source)) / (float64(math.MaxUint32) + 1)
What's the difference between a float in Java and a float64 in go?
答案1
得分: 0
根据Stack Overflow上的这个问题,MaxUint32
是Go类型系统中可用的最大32位数字的常量,范围从0到4,294,967,295。
至于Java,我可以解释一下Java只有有符号的数值类型。正如tgdavies所评论的那样,这意味着Java中最大的有符号32位整数是Go中无符号32位整数的一半:2,147,483,647。为了与Go兼容,可以在Java中使用64位的long
来容纳从Go传入的值。
近年来,Java添加了一种处理无符号数的方法。但我认为这应该只在特殊情况下使用。可以参考《在Java中声明无符号整数》这篇答案,特别是其中的一个回答。
我可以引用Oracle公司免费提供的《Java教程》中的内容,你在提问关于基本Java问题之前应该阅读一下:
Java编程语言支持的八种基本数据类型有:
byte
:byte
数据类型是一个8位的有符号二进制补码整数。它的最小值是-128,最大值是127(包括)。在大型数组中,byte
数据类型可以节省内存,这在实际内存限制的情况下非常有用。它们也可以用来代替int
,在代码中使用它们的限制可以帮助澄清你的代码;变量的范围受限可以作为一种文档形式。
short
:short
数据类型是一个16位的有符号二进制补码整数。它的最小值是-32,768,最大值是32,767(包括)。与byte
一样,同样的指导方针适用:在需要节省内存的大型数组中使用short
。
int
:默认情况下,int
数据类型是一个32位的有符号二进制补码整数,它的最小值是-231,最大值是231-1。在Java SE 8及更高版本中,可以使用int
数据类型表示无符号的32位整数,它的最小值是0,最大值是232-1。使用Integer
类将int
数据类型用作无符号整数。有关更多信息,请参阅《数字类》部分。Integer
类中添加了compareUnsigned
、divideUnsigned
等静态方法,用于支持无符号整数的算术运算。
long
:long
数据类型是一个64位的二进制补码整数。有符号的long
的最小值是-263,最大值是263-1。在Java SE 8及更高版本中,可以使用long
数据类型表示无符号的64位长整数,它的最小值是0,最大值是264-1。当需要比int
提供的范围更广的值时,使用这种数据类型。Long
类还包含了像compareUnsigned
、divideUnsigned
等方法,用于支持无符号的long
的算术运算。
float
:float
数据类型是一个单精度的32位IEEE 754浮点数。它的值范围超出了本讨论的范围,但在Java语言规范的浮点类型、格式和值部分有详细说明。与byte
和short
的建议相同,如果需要在大型浮点数数组中节省内存,可以使用float
(而不是double
)。这种数据类型不应该用于精确值,比如货币。对于这个目的,你需要使用java.math.BigDecimal
类。《数字和字符串》部分介绍了Java平台提供的BigDecimal
和其他有用的类。
double
:double
数据类型是一个双精度的64位IEEE 754浮点数。它的值范围超出了本讨论的范围,但在Java语言规范的浮点类型、格式和值部分有详细说明。对于十进制值,这种数据类型通常是默认选择。如上所述,这种数据类型不应该用于精确值,比如货币。
boolean
:boolean
数据类型只有两个可能的值:true和false。使用这种数据类型来跟踪true/false条件。这种数据类型表示一位信息,但它的“大小”没有明确定义。
char
:char
数据类型是一个单个的16位Unicode字符。它的最小值是'\u0000'(或0),最大值是'\uffff'(或65,535,包括)。
最后一个char
是遗留的,通常应该避免使用,而应该使用代码点整数。
所有这些基本类型都有包装类,当你需要一个对象时使用。
对于超大整数,使用BigInteger
类。
对于超大/超小的小数,使用BigDecimal
。当你需要精确度而不是执行速度时,也使用BigDecimal
。使用情况包括小数货币问题。
英文:
According to this Question on Stack Overflow, MaxUint32
is a constant for the maximum 32-bit number available within in the Go type system, ranging from 0 to 4,294,967,295.
As for Java, I can explain that Java has only signed numeric types. As commented by tgdavies, that means the largest signed 32-bit integer in Java is half that of the unsigned 32-bit integer in Go: 2,147,483,647. As a workaround for compatibility with Go, just us a 64-bit long
in Java to accommodate values coming in from Go.
In recent years a facility was added to address numbers as if unsigned. But I believe that should be used only on an exceptional basis. See Declaring an unsigned int in Java, especially this Answer.
And I can quote from The Java Tutorials, provided free-of-cost by Oracle corp, which you should read before posting here on basic Java matters:
>The eight primitive data types supported by the Java programming language are:
>
>byte
: The byte
data type is an 8-bit signed two's complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive). The byte data type can be useful for saving memory in large arrays, where the memory savings actually matters. They can also be used in place of int
where their limits help to clarify your code; the fact that a variable's range is limited can serve as a form of documentation.
>
>short
: The short
data type is a 16-bit signed two's complement integer. It has a minimum value of -32,768 and a maximum value of 32,767 (inclusive). As with byte
, the same guidelines apply: you can use a short to save memory in large arrays, in situations where the memory savings actually matters.
>
>int
: By default, the int
data type is a 32-bit signed two's complement integer, which has a minimum value of -2<sup>31</sup> and a maximum value of 2<sup>31</sup>-1. In Java SE 8 and later, you can use the int
data type to represent an unsigned 32-bit integer, which has a minimum value of 0 and a maximum value of 2<sup>32</sup>-1. Use the Integer
class to use int data type as an unsigned integer. See the section The Number Classes for more information. Static methods like compareUnsigned
, divideUnsigned
etc have been added to the Integer
class to support the arithmetic operations for unsigned integers.
>
>long
: The long
data type is a 64-bit two's complement integer. The signed long
has a minimum value of -2<sup>63</sup> and a maximum value of 2<sup>63</sup>-1. In Java SE 8 and later, you can use the long data type to represent an unsigned 64-bit long, which has a minimum value of 0 and a maximum value of 2<sup>64</sup>-1. Use this data type when you need a range of values wider than those provided by int
. The Long
class also contains methods like compareUnsigned
, divideUnsigned
etc to support arithmetic operations for unsigned long
.
>
>float
: The float
data type is a single-precision 32-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in the Floating-Point Types, Formats, and Values section of the Java Language Specification. As with the recommendations for byte and short, use a float (instead of double) if you need to save memory in large arrays of floating point numbers. This data type should never be used for precise values, such as currency. For that, you will need to use the java.math.BigDecimal class instead. Numbers and Strings covers BigDecimal and other useful classes provided by the Java platform.
>
>double
: The double
data type is a double-precision 64-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in the Floating-Point Types, Formats, and Values section of the Java Language Specification. For decimal values, this data type is generally the default choice. As mentioned above, this data type should never be used for precise values, such as currency.
>
>boolean
: The boolean
data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.
>
>char
: The char
data type is a single 16-bit Unicode character. It has a minimum value of '\u0000' (or 0) and a maximum value of '\uffff' (or 65,535 inclusive).
That last one, char
, is legacy, and should generally be avoided in favor of using code point integer numbers.
All of those primitive types have wrapper classes, when you need an object.
For extra large integers, use BigInteger
class.
For extra large/small fractional numbers, use BigDecimal
. Also use BigDecimal
when you need accuracy rather than speed-of-execution. Uses cases include fractional money matters.
专注分享java语言的经验与见解,让所有开发者获益!
评论