コンテンツにスキップ

Go/int16

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

int16はGoにおいて事前宣言された符号付き16ビット整数型です。サイズは明確に定義されており、-32,768から32,767までの値を表現できます。

基本的な特徴

[編集]
  • 値の範囲: -32,768 から 32,767 (2^15-1)
  • サイズ: 常に16ビット (2バイト)
  • 符号: あり (signed)
  • ゼロ値: 0

他のキーワードとの組み合わせ

[編集]

型変換

[編集]
var a int16 = 10000
var b int = int(a)      // int16からintへの明示的変換
var c float32 = float32(a)    // int16からfloat32への変換
var d int16 = int16(30000)    // 他の数値型からint16への変換
var e int8 = int8(a)    // int16からint8への変換(注意:オーバーフローの可能性あり)

定数との組み合わせ

[編集]
const maxInt16 int16 = 32767
const minInt16 int16 = -32768

型アサーション

[編集]
var i interface{} = int16(12345)
if val, ok := i.(int16); ok {
    fmt.Println("値はint16型で:", val)
}

型スイッチ

[編集]
func checkType(i interface{}) {
    switch v := i.(type) {
    case int16:
        fmt.Println("これはint16型:", v)
    case int8:
        fmt.Println("これはint8型:", v)
    default:
        fmt.Println("これはint16型でもint8型でもない")
    }
}

ビット演算

[編集]
var a int16 = 0x0F0F
var b int16 = 0xF0F0
fmt.Printf("AND: %04X\n", a & b)    // 0x0000
fmt.Printf("OR: %04X\n", a | b)     // 0xFFFF
fmt.Printf("XOR: %04X\n", a ^ b)    // 0xFFFF
fmt.Printf("左シフト: %04X\n", a << 4)  // 0xF0F0
fmt.Printf("右シフト: %04X\n", a >> 4)  // 0x00F0

ユースケース

[編集]
  1. オーディオ処理
    • 16ビットPCMオーディオデータの処理
    • WAVファイルの読み書き
  2. グラフィック処理
    • 16ビット色深度の画像処理
    • ピクセル値の操作
  3. 組み込みシステム
    • 16ビットマイクロコントローラとの通信
    • レジスタ値やメモリアドレスの表現
  4. ハードウェアインターフェース
    • センサーデータの読み取り(例:16ビットADC)
    • 電子機器との通信プロトコル
  5. メモリ効率化
    • int32よりメモリ使用量を削減しつつ、int8より広い範囲の値を表現
    • 大規模配列でのメモリ使用量の最適化
  6. ネットワークプロトコル
    • TCP/IPヘッダのポート番号(16ビット値)
    • バイナリプロトコルのデータフィールド
  7. ファイルフォーマット解析
    • 16ビット単位で構造化されたバイナリファイル
    • フォーマット互換性のための正確なビット表現
  8. 高精度測定値の格納
    • センサーデータや測定値で-32,768〜32,767の範囲に収まるもの
  9. 固定小数点演算
    • 限られたリソースでの小数演算の実装
  10. 配列での使用
    var readings [1000]int16  // 2KBのメモリを使用
    
  11. スライスでの使用
    audioData := make([]int16, 44100*2)  // 2チャンネル、1秒分のオーディオデータ
    
  12. バイナリデータの変換
    // バイト列からint16への変換(リトルエンディアン)
    func bytesToInt16(b []byte) int16 {
        return int16(binary.LittleEndian.Uint16(b))
    }
    

注意点

[編集]
  • エンディアン: マルチバイト値としてのint16はエンディアン(バイト順)の影響を受けます
    buf := make([]byte, 2)
    binary.LittleEndian.PutUint16(buf, uint16(12345))  // リトルエンディアン
    binary.BigEndian.PutUint16(buf, uint16(12345))     // ビッグエンディアン
    
  • オーバーフロー: int16は-32,768〜32,767の範囲を超えるとオーバーフローが発生します
    var a int16 = 32767
    a++  // オーバーフローで -32768 になる
    
  • 型互換性: 他の整数型との自動的な互換性がないため、明示的な型変換が必要です
  • アライメント: 一部のアーキテクチャでは、16ビット値のメモリアライメントが性能に影響することがあります

Goでint16型を選択する際は、必要な値の範囲とメモリ効率のバランスを考慮し、使用するハードウェアやプロトコルとの互換性を確認することが重要です。