int の解説と実装リファレンス

記事内には広告が含まれています。

【概要】

int は Arduino 環境において、符号付きの整数値を保持するための基本データ型です。プログラム内での数値計算、カウンタ、および状態の保持など、整数を扱う基本的な処理において最も頻繁に使用される型の一つです。

【仕様】

  • データ型: 符号付き整数 (Signed Integer)
  • メモリサイズ: アーキテクチャに依存する
  • AVR系 (Uno, Nano, Mega等): 16ビット (2バイト)
  • ARM/ESP32系 (Due, MKR, ESP32等): 32ビット (4バイト)
  • 初期状態: 未初期化の状態では、メモリ内の不定値(ゴミデータ)を保持します。変数定義時に明示的な初期化が推奨されます。
  • 値の範囲:
  • AVR系: -32,768 ~ 32,767
  • 32ビット系: -2,147,483,648 ~ 2,147,483,647

【技術的特徴】

  • アーキテクチャ依存性: Arduino 環境では、ハードウェアの CPU アーキテクチャによって int のビット幅が変化します。特に Uno 等の 8ビット/16ビット系から 32ビット系へ移行する場合、int の許容範囲が大幅に拡大することに注意が必要です。
  • 符号付き演算: 最上位ビット(MSB)を符号ビットとして扱い、2の補数形式で表現されます。
  • 他の型との比較:
  • short: AVR系では int と同等(16ビット)ですが、32ビット系では 16ビットとして扱われることがあります。
  • long: 常に 32ビット以上(通常 32ビット)を保証します。AVR系では int より大きな値を扱う際に必須となります。
  • byte / uint8_t: 8ビット(0-255)の符号なし整数です。メモリを節約する場合に使用します。

【注意点】

  • オーバーフロー: int 型の最大値を超えて加算を行うと、ラップアラウンド(最小値への跳ね返り)が発生します。特に AVR系で大きな数値を計算する際に頻出するバグの原因となります。
  • 計算の精度: 浮動小数点数(float, double)との演算を行う際、暗黙的な型変換により精度が失われたり、予期しない丸め処理が行われたりすることがあります。
  • メモリ消費: 32ビット系マイコンにおいて、小さな数値を扱うために int を多用するとメモリを無駄に消費する可能性があります。極力少ないビット数で済む場合は uint8_t 等の固定幅整数型を検討してください。
  • 割り込みの影響: int 型の変数が割り込みハンドラとメインループの両方で共有される場合、原子性(Atomicity)の問題が発生します。16ビット環境において int 型の読み書きは複数サイクルを要するため、クリティカルセクションの保護が必要です。

【サンプルコード】

// 変数の宣言と初期化
int counter = 0; 
const int MAX_LIMIT = 30000; 

void setup() {
  Serial.begin(9600);
}

void loop() {
  // カウンタの加算
  counter += 100; 

  Serial.print("Current Counter: ");
  Serial.println(counter);

  // オーバーフローの簡易チェック(AVR系を想定)
  if (counter > MAX_LIMIT) {
    Serial.println("Warning: Approaching overflow limit.");
    counter = 0; // リセット
  }

  delay(1000);
}

【活用例】

  • ループ制御: for や while 文におけるインデックスの管理。
  • センサーデータ処理: 温度や湿度など、小数点以下の精度を必要としない、または整数に丸めたデータの保持。
  • 状態遷移マシン (State Machine): 現在の状態を数値で定義し、条件分岐の制御に使用。
  • タイマー管理: millis() の戻り値との比較において、秒単位の計算を行う際の変数として使用(ただし、millis() 自体は unsigned long を使用)。

コメント

タイトルとURLをコピーしました