Максимальное значение для типа 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.

1246   5  

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

    Ничего не найдено.