簡単な要約:
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
れています。最大値を決定するには1
、そのビット数から1を引いた数だけシフトします。(1 << bits.UintSize) - 1
の最大値を計算するときはuint
、通常、それを明示的にuint
(またはそれ以上の)変数に入れる必要があります。そうしないと、デフォルトでその計算を符号付きint
(ここで、明らかに、それは適合しないでしょう)、それで:
const MaxUint uint = (1 << bits.UintSize) - 1
それがあなたの質問への直接の答えですが、あなたが興味を持つかもしれないいくつかの関連する計算もあります。
よると仕様、uint
そしてint
常に同じ大きさです。
uint
32ビットまたは64ビット
int
同じサイズ uint
したがって、この定数を使用しての最大値を決定することもできます。int
その同じ答えを取り、2
それからで除算することにより、1
つまり:(1 << bits.UintSize) / 2 - 1
そして、の最小値。その数のビットでint
シフト1
し、結果をで除算し-2
ます。つまり:(1 << bits.UintSize) / -2
要約すれば:
MaxUint: (1 << bits.UintSize) - 1
MaxInt: (1 << bits.UintSize) / 2 - 1
MinInt: (1 << bits.UintSize) / -2
完全な例(以下と同じである必要があります)
package main
import "fmt"
import "math"
import "math/bits"
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)
}
int(^uint(0) >> 1) // largest int
から抽出されたこのスニペットをご覧ください