Go/int32
表示
< Go
int32はGoにおいて事前宣言された符号付き32ビット整数型です。サイズは明確に定義されており、-2,147,483,648から2,147,483,647までの値を表現できます。
基本的な特徴
[編集]- 値の範囲: -2,147,483,648 から 2,147,483,647 (2^31-1)
- サイズ: 常に32ビット (4バイト)
- 符号: あり (signed)
- ゼロ値: 0
他のキーワードとの組み合わせ
[編集]型変換
[編集]var a int32 = 1000000 var b int = int(a) // int32からintへの明示的変換 var c float32 = float32(a) // int32からfloat32への変換 var d int64 = int64(a) // int32からint64への変換 var e int16 = int16(a) // int32からint16への変換(注意:オーバーフローの可能性あり) var f rune = rune(65) // int32とruneは同じ基底型(rune = int32)
定数との組み合わせ
[編集]const maxInt32 int32 = 2147483647 const minInt32 int32 = -2147483648
型アサーション
[編集]var i interface{} = int32(42424242) if val, ok := i.(int32); ok { fmt.Println("値はint32型で:", val) }
型スイッチ
[編集]func checkType(i interface{}) { switch v := i.(type) { case int32: fmt.Println("これはint32型:", v) case rune: fmt.Println("これはrune型(基底型はint32):", v) default: fmt.Println("これはint32型でもrune型でもない") } }
ビット演算
[編集]var a int32 = 0x0F0F0F0F var b int32 = 0xF0F0F0F0 fmt.Printf("AND: %08X\n", a & b) // 0x00000000 fmt.Printf("OR: %08X\n", a | b) // 0xFFFFFFFF fmt.Printf("XOR: %08X\n", a ^ b) // 0xFFFFFFFF fmt.Printf("左シフト: %08X\n", a << 4) // 0xF0F0F0F0 fmt.Printf("右シフト: %08X\n", a >> 4) // 0x00F0F0F0 fmt.Printf("ビット反転: %08X\n", ^a) // 0xF0F0F0F0
runeとの関連
[編集]var r rune = '漢' // runeはint32のエイリアス var n int32 = int32(r) // 変換不要(同じ型) fmt.Printf("漢字のUnicodeコードポイント: %d (0x%X)\n", n, n)
ユースケース
[編集]- Unicodeの文字処理(rune)
for _, r := range "Hello, 世界" { fmt.Printf("%c: %d\n", r, r) // 各文字とそのUnicodeコードポイント }
- グラフィック処理
- RGBAカラー値の表現
- 32ビット色深度の画像処理
- ネットワークプログラミング
- IPアドレスの内部表現
ip := net.IPv4(192, 168, 1, 1) ipInt := binary.BigEndian.Uint32(ip)
- 暗号化と乱数生成
- 暗号アルゴリズムでの32ビット演算
- 乱数生成のシード値
- ハッシュ関数
- ハッシュ値の計算や比較
hash := fnv.New32() hash.Write([]byte("hello")) fmt.Printf("Hash: %d\n", hash.Sum32())
- システムプログラミング
- ファイルディスクリプタやエラーコード
- システムコールの戻り値
- 信号処理
- 32ビット精度のサンプルデータ処理
- デジタルフィルター実装
- 時間に関する処理
- UNIXタイムスタンプ(32ビットの場合は2038年問題に注意)
var timestamp int32 = int32(time.Now().Unix())
- バイナリファイルの解析
- 32ビット単位で構造化されたデータ
var header struct { Magic int32 Version int32 Size int32 } binary.Read(file, binary.LittleEndian, &header)
- 固定サイズデータの効率的な処理
- メモリマップドファイル操作
- 大規模数値計算
- システム互換性
- C言語のint型との互換性(多くのプラットフォームで)
// #include <stdlib.h> // int c_function(int value); import "C" func CallC(value int32) int32 { return int32(C.c_function(C.int(value))) }
- スライス/配列での使用
buffer := make([]int32, 1024) // 4KB のバッファ
- atomic操作
var counter int32 = 0 atomic.AddInt32(&counter, 1) value := atomic.LoadInt32(&counter)
注意点
[編集]- エンディアン:
int32は4バイトであるため、エンディアン(バイト順)に注意が必要ですbuf := make([]byte, 4) binary.LittleEndian.PutUint32(buf, uint32(value)) // リトルエンディアン binary.BigEndian.PutUint32(buf, uint32(value)) // ビッグエンディアン
- オーバーフロー: 範囲を超える演算ではオーバーフローが発生します
var a int32 = 2147483647 a++ // オーバーフローで -2147483648 になる
- 64ビットマシンでの考慮点: 64ビットマシンでも常に32ビットのまま
var a int32 = 100 var b int = int(a) // 64ビットマシンでは32ビット→64ビットへの変換
- intとの互換性: Goでは、
intは実行環境によってサイズが異なるため(32ビットまたは64ビット)、int32との明示的な変換が必要 - パフォーマンス: 現代の64ビットCPUでは、
int64の演算が最適化されている場合があり、int32が必ずしも高速であるとは限りません - メモリアライメント: 一部のアーキテクチャでは、32ビット値のメモリアライメントが性能に影響することがあります
Goでのプログラミングでは、特に正確なメモリレイアウトが必要な場合や、外部システムとの互換性が求められる場合にint32型を使用すると良いでしょう。また、Unicodeの文字処理ではruneとして広く使われています。