コンテンツにスキップ

Go/int32

出典: フリー教科書『ウィキブックス(Wikibooks)』
< 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)

ユースケース

[編集]
  1. Unicodeの文字処理(rune)
    • Goにおいて、runeint32のエイリアスで、Unicodeコードポイントを表現
    for _, r := range "Hello, 世界" {
        fmt.Printf("%c: %d\n", r, r) // 各文字とそのUnicodeコードポイント
    }
    
  2. グラフィック処理
    • RGBAカラー値の表現
    • 32ビット色深度の画像処理
  3. ネットワークプログラミング
    • IPアドレスの内部表現
    ip := net.IPv4(192, 168, 1, 1)
    ipInt := binary.BigEndian.Uint32(ip)
    
  4. 暗号化と乱数生成
    • 暗号アルゴリズムでの32ビット演算
    • 乱数生成のシード値
  5. ハッシュ関数
    • ハッシュ値の計算や比較
    hash := fnv.New32()
    hash.Write([]byte("hello"))
    fmt.Printf("Hash: %d\n", hash.Sum32())
    
  6. システムプログラミング
    • ファイルディスクリプタやエラーコード
    • システムコールの戻り値
  7. 信号処理
    • 32ビット精度のサンプルデータ処理
    • デジタルフィルター実装
  8. 時間に関する処理
    • UNIXタイムスタンプ(32ビットの場合は2038年問題に注意)
    var timestamp int32 = int32(time.Now().Unix())
    
  9. バイナリファイルの解析
    • 32ビット単位で構造化されたデータ
    var header struct {
       Magic   int32
       Version int32
       Size    int32
    }
    binary.Read(file, binary.LittleEndian, &header)
    
  10. 固定サイズデータの効率的な処理
    • メモリマップドファイル操作
    • 大規模数値計算
  11. システム互換性
    • 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)))
    }
    
  12. スライス/配列での使用
    buffer := make([]int32, 1024) // 4KB のバッファ
    
  13. 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として広く使われています。