Go中inttypes的最大值
如何指定unsigned
整数types可表示的最大值?
我想知道如何在下面的循环中初始化min
,从一些结构体中传递计算最小和最大长度。
var minLen uint = ??? var maxLen uint = 0 for _, thing := range sliceOfThings { if minLen > thing.minLen { minLen = n } if maxLen < thing.maxLen { maxLen = n } } if minLen > maxLen { // If there are no values, clamp min at 0 so that min <= max. minLen = 0 }
所以第一次通过比较, minLen >= n
。
https://groups.google.com/group/golang-nuts/msg/71c307e4d73024ce?pli=1
相关部分:
由于整数types使用二进制补码algorithm,因此可以推断
int
和uint
的最小/最大常量值。 例如,const MaxUint = ^uint(0) const MinUint = 0 const MaxInt = int(MaxUint >> 1) const MinInt = -MaxInt - 1
根据@ CarelZA的评论:
uint8 : 0 to 255 uint16 : 0 to 65535 uint32 : 0 to 4294967295 uint64 : 0 to 18446744073709551615 int8 : -128 to 127 int16 : -32768 to 32767 int32 : -2147483648 to 2147483647 int64 : -9223372036854775808 to 9223372036854775807
http://golang.org/doc/go_spec.html#Numeric_types物理types限制。;
最大值是在math包中定义的,所以在你的情况下:math.MaxUint32
小心,因为没有溢出 – 递增过去最大导致环绕。
我最初使用@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 (ie 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 )
最后两步是因为在二进制补码运算中如何表示正数和负数。 数字types的Go语言规范部分是指读者阅读相关的维基百科文章 。 我还没有读到,但是我从Charles Petzold的“ Code ”一书中学到了两个补充,这是一本非常容易理解的计算机和编码基础知识。
我把上面的代码(减去大部分注释)放到一个小整数math包中 。
解决这个问题的一个办法就是从价值本身出发:
var minLen, maxLen uint if len(sliceOfThings) > 0 { minLen = sliceOfThings[0].minLen maxLen = sliceOfThings[0].maxLen for _, thing := range sliceOfThings[1:] { if minLen > thing.minLen { minLen = thing.minLen } if maxLen < thing.maxLen { maxLen = thing.maxLen } } }