Home  >  Article  >  Backend Development  >  An article analyzing the maximum value of Int in Go

An article analyzing the maximum value of Int in Go

藏色散人
藏色散人forward
2021-11-15 15:35:214753browse

This article is introduced by the tutorial column of go language to introduce the maximum value of Int in Go. I hope it will be helpful to friends in need!

Summary:

import "math/bits"const (
    MaxUint uint = (1 << bits.UintSize) - 1
    MaxInt int = (1 << bits.UintSize) / 2 - 1
    MinInt int = (1 << bits.UintSize) / -2)

Background:

I think you know, uint type size Same as uint32 or uint64, depending on your platform. Typically the sizeless version is only used if there is no risk of getting close to the maximum, as the sizeless version can use "native" types, which depends on the platform, and it tends to be faster.

Note that "faster" is because using non-native types requires the processor to perform additional math and bounds checks in order to simulate larger or smaller integers. Therefore, the processor (or compiler's optimized code) will perform better than the code that adds bounds checks.

That being said, there are still situations where it's useful to know what you're working with.

The "math/bits" package contains the uint size in bytes (Translator's Note: UintSize). To determine the maximum value, shift 1 to the left by a number of places and subtract 1. That is: (1 << bits.UintSize) - 1

Note that when calculating the maximum value of uint, you usually need to make it explicit into a uint (or larger type) type variable, otherwise the compiler may fail because it will default to trying to assign that calculation to a signed int (very Obviously, it doesn't fit), so:

const MaxUint uint = (1 << bits.UintSize) - 1

This is a direct answer to your question, but you might be interested in some related calculations.

According to the spec, uint and int are always the same size.

##uint 32-bit or 64-bit

int and uint are the same size

so we can also use this constant to determine the maximum value of

int by taking the same answer and dividing by 2, then subtract 1. That is: (1 << bits.UintSize) / 2 - 1

and the minimum value of

int, by shifting 1 that many digits and divide the result by -2. That is: (1 << bits.UintSize) / -2

In short:

** MaxUint: **

(1 << bits.UintSize) - 1

** MaxInt: **

(1 << bits.UintSize) / 2 - 1

** MinInt : **

(1 << bits.UintSize) / -2

Full example (should be the same as the image below):

package mainimport (
    "fmt"
    "math"
    "math/bits"
    "runtime"
    "strconv")func main() {
    var mi32 int64 = math.MinInt32    var mi64 int64 = math.MinInt64    var i32 uint64 = math.MaxInt32    var ui32 uint64 = math.MaxUint32    var i64 uint64 = math.MaxInt64    var ui64 uint64 = math.MaxUint64    var ui uint64 = (1 << bits.UintSize) - 1
    var i uint64 = (1<<bits.UintSize)/2 - 1
    var mi int64 = (1 << bits.UintSize) / -2

    fmt.Printf(" MinInt32: %d\n", mi32)
    fmt.Printf(" MaxInt32:  %d\n", i32)
    fmt.Printf("MaxUint32:  %d\n", ui32)
    fmt.Printf(" MinInt64: %d\n", mi64)
    fmt.Printf(" MaxInt64:  %d\n", i64)
    fmt.Printf("MaxUint64:  %d\n", ui64)
    fmt.Printf("  MaxUint:  %d\n", ui)
    fmt.Printf("   MinInt: %d\n", mi)
    fmt.Printf("   MaxInt:  %d\n", i)

    fmt.Println("MaxUint:", uint(math.MaxUint))
    fmt.Println("MinInt:", math.MinInt)
    fmt.Println("MaxInt:", math.MaxInt)

    fmt.Println("系统架构:", runtime.Compiler, runtime.GOARCH, runtime.GOOS)
    fmt.Println("Int 大小:", strconv.IntSize)}
Output:

MinInt32: -2147483648
 MaxInt32:  2147483647MaxUint32:  4294967295
 MinInt64: -9223372036854775808
 MaxInt64:  9223372036854775807MaxUint64:  18446744073709551615
  MaxUint:  18446744073709551615
   MinInt: -9223372036854775808
   MaxInt:  9223372036854775807MaxUint: 18446744073709551615MinInt: -9223372036854775808MaxInt: 9223372036854775807系统架构: gc amd64 darwin
Int 大小: 64

Original address: https://stackoverflow.com/questions/6878...

Translation address: https://learnku.com/go/t/62359

The above is the detailed content of An article analyzing the maximum value of Int in Go. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:learnku.com. If there is any infringement, please contact admin@php.cn delete