【概要】
short(または short int)は、C/C++言語における標準的な整数型の一つです。Arduino環境において、shortは特定の範囲内の整数を効率的に保持するために使用されます。組み込みシステムにおいては、メモリリソースが極めて限定されているため、必要以上に大きなデータ型(intやlong)を避け、適切なサイズの型を選択することは、システムの最適化における基本原則です。
【仕様】
- データ型: 符号付き整数(Signed Integer)
- サイズ: 通常 2バイト(16ビット)
- 表現範囲: -32,768 ~ 32,767
- 初期状態: 変数として宣言された直後は不定値(Garbage value)。必ず初期化が必要。
- メモリ占有量: 多くのArduino環境(AVRアーキテクチャ等)において、16ビットのメモリ領域を消費します。
【技術的特徴】
- 環境依存性:
- AVR(Arduino Uno, Nano等):
int型自体が16ビットであるため、shortとintは同等のサイズとなります。 - 32ビットマイコン(ESP32, ARM Cortex-M等):
int型は32ビットとして扱われることが多いため、shortを使用することで明示的に16ビットの範囲に制約をかけ、メモリ使用量を抑えることができます。 - 整数昇格(Integer Promotion): 算術演算を行う際、コンパイラは
short型の値を一時的にint型に昇格させてから演算を実行します。この挙動を理解せずに比較演算を行うと、予期せぬ結果を招くことがあります。 - 演算効率: 8ビットや16ビットのレジスタを扱うCPUにおいて、16ビットの
short演算は、32ビットのlong演算よりも少ない命令数で完了する場合があります。
【注意点】
- オーバーフロー: 32,767を超える値を代入、あるいは計算結果として得た場合、値は負の範囲へラップアラウンド(Wrap-around)します。動的な計算を行う際は、最大値を超える可能性があるか常に監視する必要があります。
- 符号の考慮: 符号なしの16ビット整数が必要な場合は、
unsigned short(0 ~ 65,535)を使用してください。shortは負の値を許容するため、ビット演算を行う際に符号ビットの影響を受けることがあります。 - 割り込みの影響: 割り込みサービスルーチン(ISR)内で
short型の変数を共有する場合、マルチバイト(2バイト)の書き込みが原子的な操作(Atomic operation)にならない可能性があるため、揮発性(volatile)の付与や排他制御を検討する必要があります。
【サンプルコード】
/*
* short型の範囲とオーバーフローの挙動を確認するサンプル
*/
short sensorValue;
short increment = 1000;
void setup() {
Serial.begin(9600);
// 初期値の設定
sensorValue = 30000;
Serial.print("Initial Value: ");
Serial.println(sensorValue);
}
void loop() {
// 30000 + 1000 = 31000 (範囲内)
sensorValue += increment;
Serial.print("After 1st increment: ");
Serial.println(sensorValue);
delay(1000);
// 31000 + 1000 = 32000 (範囲内)
sensorValue += increment;
Serial.print("After 2nd increment: ");
Serial.println(sensorValue);
delay(1000);
// 32000 + 1000 = 33000 -> オーバーフロー発生
// 32767を超えたため、負の値へ反転する
sensorValue += increment;
Serial.print("After 3rd increment (Overflow): ");
Serial.println(sensorValue);
while(1); // 停止
}
【活用例】
- ADC(アナログ・デジタル変換)データの保持:
10ビット(0-1023)や12ビット(0-4095)の分解能を持つADCの値を格納する際に、32ビットのlongを使用するよりもメモリ効率が良い。 - エンコーダパルス計数:
低速なモーターの回転数や、一定範囲内での位置をカウントする際の変数として利用。 - 通信プロトコルのペイロード処理:
16ビットのデータ長を持つ通信プロトコル(例:Modbusのレジスタ値など)を解析・構築する際のデータ型として適している。


コメント