ホームページ  >  記事  >  バックエンド開発  >  GoのIntの最大値を分析した記事

GoのIntの最大値を分析した記事

藏色散人
藏色散人転載
2021-11-15 15:35:214705ブラウズ

この記事は go 言語 のチュートリアルコラムで Go における Int の最大値を紹介する記事です。

概要:

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

背景:

ご存知かと思いますが、uint タイプ サイズは同じですプラットフォームに応じて、uint32 または uint64 として指定します。通常、サイズレス バージョンは、プラットフォームに依存する「ネイティブ」型を使用でき、高速になる傾向があるため、最大値に近づくリスクがない場合にのみ使用されます。

「高速」なのは、非ネイティブ型を使用すると、より大きな整数またはより小さな整数をシミュレートするために、プロセッサが追加の計算と境界チェックを実行する必要があることに注意してください。したがって、プロセッサ (またはコンパイラの最適化されたコード) は、境界チェックを追加したコードよりもパフォーマンスが高くなります。

そうは言っても、何を扱っているのかを知っておくと役立つ状況は依然としてあります。

「math/bits」パッケージには、バイト単位の uint サイズ (翻訳者注: UintSize) が含まれています。最大値を決定するには、1 を左に所定の桁シフトし、1 を減算します。つまり: (1 << bits.UintSize) - 1

uint の最大値を計算するときは、通常、それを明示的にする必要があることに注意してください。そうしないと、デフォルトでその計算を符号付き int に代入しようとするため、コンパイラは失敗する可能性があります (当然のことですが、そうではありません)。 fit)、つまり: <pre class="brush:php;toolbar:false">const MaxUint uint = (1 &lt;&lt; bits.UintSize) - 1</pre> これは質問に対する直接の答えですが、関連する計算に興味があるかもしれません。

仕様によれば、

uint

int は常に同じサイズです。

##uint

32 ビットまたは 64 ビット ##int

および uint は同じサイズ であるため、この定数を使用して、同じ答えを取得して 2 で割ることにより、

int
の最大値を決定することもできます。

から 1 を引きます。つまり、(1 << bits.UintSize) / 2 - 1int の最小値 (

1## をシフトしたもの) # その桁数を計算し、結果を

-2 で割ります。つまり: (1 << bits.UintSize) / -2 つまり: ** MaxUint: ** (1 < bits.UintSize) / -2

< bits.UintSize) - 1

** MaxInt: **

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

* * MinInt : **

(1 << bits.UintSize) / -2

完全な例 (以下の画像と同じである必要があります):

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)}

出力:

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


元のアドレス: https://stackoverflow.com/questions/6878...

翻訳アドレス: https://learnku.com/go /t/62359

以上がGoのIntの最大値を分析した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。