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


コメント