An article analyzing the maximum value of Int in Go

藏色散人
Release: 2021-11-15 15:35:21
forward
4761 people have browsed it

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)
Copy after login

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
Copy after login

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)}
Copy after login
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
Copy after login

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!

Related labels:
source:learnku.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template