如何为unsigned
整数类型指定可表示的最大值?
我想知道如何在下面的循环中初始化min
,该循环从一些结构迭代地计算最小和最大长度。
var minLen uint = ???
var maxLen uint = 0
for _, thing := range sliceOfThings {
if minLen > thing.n { minLen = thing.n }
if maxLen < thing.n { maxLen = thing.n }
}
if minLen > maxLen {
// If there are no values, clamp min at 0 so that min <= max.
minLen = 0
}
这样第一次通过比较,minLen >= n
。
发布于 2011-07-30 04:27:08
物理类型限制的https://golang.org/ref/spec#Numeric_types。
最大值是在数学包中定义的,因此在本例中是: math.MaxUint32
当心没有溢出-递增超过max会导致回绕。
发布于 2017-12-02 11:58:13
我将使用math
包来获取整数的最大值和最小值:
package main
import (
"fmt"
"math"
)
func main() {
// integer max
fmt.Printf("max int64 = %+v\n", math.MaxInt64)
fmt.Printf("max int32 = %+v\n", math.MaxInt32)
fmt.Printf("max int16 = %+v\n", math.MaxInt16)
// integer min
fmt.Printf("min int64 = %+v\n", math.MinInt64)
fmt.Printf("min int32 = %+v\n", math.MinInt32)
fmt.Printf("max float64 = %+v\n", math.MaxFloat64)
fmt.Printf("max float32 = %+v\n", math.MaxFloat32)
// etc you can see more int the `math`package
}
输出:
max int64 = 9223372036854775807
max int32 = 2147483647
max int16 = 32767
min int64 = -9223372036854775808
min int32 = -2147483648
max float64 = 1.7976931348623157e+308
max float32 = 3.4028234663852886e+38
发布于 2016-09-19 19:03:01
我最初使用的代码取自@nmichaels在他的回答中使用的讨论线程。我现在使用一个稍微不同的计算方法。我提供了一些注释,以防其他人有与@Arijoon相同的查询
const (
MinUint uint = 0 // binary: all zeroes
// Perform a bitwise NOT to change every bit from 0 to 1
MaxUint = ^MinUint // binary: all ones
// Shift the binary number to the right (i.e. divide by two)
// to change the high bit to 0
MaxInt = int(MaxUint >> 1) // binary: all ones except high bit
// Perform another bitwise NOT to change the high bit to 1 and
// all other bits to 0
MinInt = ^MaxInt // binary: all zeroes except high bit
)
最后两个步骤之所以有效,是因为正数和负数在二的补码运算中的表示方式。Numeric types上的Go语言规范部分向读者推荐了相关的Wikipedia article。我没有读过这本书,但我确实从Code by Charles Petzold一书中了解到了two的补充,这是一本非常容易理解的计算机和编码基础入门。
我将上面的代码(减去大部分注释)放入一个小integer math package中。
https://stackoverflow.com/questions/6878590
复制相似问题