Максимальное значение для типа int в Go
Как указать максимальное значение, представимое для 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.
5 ответов:
https://groups.google.com/group/golang-nuts/msg/71c307e4d73024ce?pli=1
главный части:
поскольку целочисленные типы используют арифметику дополнения двух, вы можете сделать вывод минимальные / максимальные постоянные значения для
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
https://golang.org/ref/spec#Numeric_types для ограничений физического типа.
максимальные значения определяются в пакете math, поэтому в вашем случае: math.MaxUint32
следите за тем, как нет переполнения - приращение мимо max вызывает обертывание.
Я хотел бы использовать
mathпакета для получения максимального значения и минимального значения :func printMinMaxValue() { // 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 flloat64= %+v\n", math.MaxFloat64) fmt.Printf("max float32= %+v\n", math.MaxFloat32) // etc you can see more int the `math`package }Ouput:
max int64 = 9223372036854775807 max int32 = 2147483647 max int16 = 32767 min int64 = -9223372036854775808 min int32 = -2147483648 max flloat64= 1.7976931348623157e+308 max float32= 3.4028234663852886e+38
Я изначально использовал код, взятый из потока обсуждения, который @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 )последние два шага работы, так как положительные и отрицательные числа представлены в суммы.. Раздел спецификации языка Go на числовые типы отсылает читателя к соответствующим Википедия статья. Я не читал этого, но я узнал о дополнении двух из книги Code by Charles Petzold, который является очень доступным введение в основы вычислительной техники и программирования.
Я поставил код выше (минус большинство комментариев) в немного целое число математический пакет.
один из способов решить эту проблему-получить исходные точки из самих значений:
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 } } }
Comments