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

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

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

【概要】

long は、Arduinoおよび標準的なC/C++において、32ビットの符号付き整数を保持するためのデータ型です。16ビットの範囲(-32,768から32,767)を超える数値を扱う必要がある場合に、int型に代わって標準的に使用されます。

【仕様】

  • データ型: 符号付き32ビット整数 (Signed 32-bit Integer)
  • メモリサイズ: 4バイト(32ビット)
  • 表現範囲: -2,147,483,648 ~ 2,147,483,647
  • 初期状態: 未初期化の場合、メモリ上の残存データ(不定値)を保持するため、必ず初期値を代入することが推奨されます。

【技術的特徴】

アーキテクチャによる依存性

Arduino環境において、longの挙動は使用するマイコンのアーキテクチャに依存します。
– 8bit AVRマイコン(Uno, Nano, Mega等): int型が16ビットであるため、longはより広い範囲を確保するための主要な手段となります。32ビット演算は複数のCPU命令を組み合わせて実行されるため、16ビット演算よりも計算コストが高くなります。
– 32bitマイコン(ESP32, Due, MKR1010等): int型自体が32ビットである場合が多く、この環境ではintとlongのメモリサイズおよび表現範囲は同一となります。

他の型との比較

| 型 | サイズ (AVR) | サイズ (32bit ARM/ESP32) | 備考 |
| int | 16 bit | 32 bit | 基本的な整数型 |
| long | 32 bit | 32 bit | 32ビット符号付き整数 |
| unsigned long | 32 bit | 32 bit | 0 ~ 4,294,967,295 (符号なし) |
| long long | 64 bit | 64 bit | 64ビット整数(非常に大きな数値用) |

【注意点】

1. オーバーフローの挙動

long型の最大値(2,147,483,647)を超えて加算が行われた場合、数値は最小値(-2,147,483,648)へラップアラウンドします。これは予期せぬ動作を引き起こすため、大きな数値を扱う際はオーバーフローの境界チェックが必要です。

2. 演算時の型昇格

int型とlong型の変数を混在させて計算する場合、結果は自動的にlong型へと昇格されます。しかし、計算過程において一時的な中間結果がintの範囲を超えてしまう場合、精度喪失や意図しない挙動が発生する可能性があるため、定数に対しては 1000L のように明示的にlongリテラルを使用することが推奨されます。

3. メモリリソース

longはint(AVR環境)の2倍のメモリを消費します。多数の変数を配列として確保する場合、RAMの消費量に注意を払う必要があります。

【サンプルコード】

ミリ秒単位の経過時間を累積し、特定の閾値を超えた場合に動作するカウンターの例です。

// 32ビットの符号付き整数として定義
long targetCount = 500000; 
long currentCount = 0; 

void setup() {
  Serial.begin(9600);
  Serial.println("Counter started.");
}

void loop() {
  // カウントの加算(16ビットのintではオーバーフローする範囲)
  currentCount += 100; 

  if (currentCount >= targetCount) {
    Serial.print("Target reached: ");
    Serial.println(currentCount);
    currentCount = 0; // リセット
  }

  delay(10); 
}

【活用例】

  • 時間の計測: millis() 関数の戻り値(unsigned long)と組み合わせ、システム起動からの経過時間を計算する際の変数保持。
  • 高分解能のエンコーダ値: 数千パルス以上のカウントを必要とするモーター制御等のエンコーダ値の保持。
  • 物理演算: 数千〜数百万単位の距離、面積、または体積を計算する際の中間変数の保持。

コメント

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