int() の解説と実装リファレンス
【概要】
Arduino環境における int() は、厳密には独立した関数ではなく、整数型(integer)への型キャスト(型変換)を指します。数値データ(特に浮動小数点数 float や double、あるいはより大きな範囲を持つ long)を、システムの標準的な整数型へと変換する操作です。この変換により、小数点以下の情報が破棄され、整数値のみが保持されます。
【仕様】
- 入力(ソース): 任意の数値型(
float,double,long,unsigned int,byte等)。 - 出力(ターゲット):
int型。 - データ型サイズ:
- AVRアーキテクチャ (Uno, Nano, Mega等): 16ビット(範囲: -32,768 ~ 32,767)
- ARM/ESP32/ESP8266アーキテクチャ: 32ビット(範囲: -2,147,483,648 ~ 2,147,483,647)
- 初期状態: キャスト操作であるため、初期状態は存在せず、実行時の評価結果に依存する。
- 変換規則: 小数点以下の値は切り捨て(Truncation)処理が行われる。四捨五入は行われない。
【技術的特徴】
- プラットフォーム依存性:
Arduinoはクロスプラットフォームな環境であるため、intのビット幅はハードウェアに依存する。ポータビリティを重視するコードでは、この差異を考慮する必要がある。 - 整数昇格(Integer Promotion):
C++の規則に基づき、計算過程においてより小さな整数型(char,short等)は、演算の際に自動的にint型へと昇格される。 - オーバーフロー挙動:
変換後の値がint型の最大値または最小値を越える場合、標準的なC言語の挙動に従い、ラップアラウンド(符号付き整数の場合、負の方向へのラップ)が発生する。
【注意点】
- 精度損失:
floatからintへキャストする際、小数点以下の情報は完全に消失する。センサーデータの微小な変化を扱う場合は、計算の最終工程までfloatを維持すべきである。 - ビット幅の不一致: AVRマイコン(16ビット
int)で動作するプログラムをESP32(32ビットint)に移植する際、大きな数値の計算で意図しないオーバーフローや、逆に予期せぬ範囲の確保が発生する可能性がある。 - ゼロ除算への影響: キャストによって分母が
0になるような計算(例:(int)(1 / 2))を行うと、実行時にゼロ除算エラーを引き起こす可能性がある(この例では1/2が整数演算で0になるため)。
【サンプルコード】
void setup() {
Serial.begin(9600);
// 1. 小数点以下の切り捨て動作
float sensorValue = 12.85;
int castedValue = (int)sensorValue;
Serial.print("Original: ");
Serial.println(sensorValue);
Serial.print("Casted: ");
Serial.println(castedValue); // 出力: 12
// 2. プラットフォームによる範囲の確認 (AVRではここで挙動に注意)
long largeValue = 40000;
int smallInt = (int)largeValue;
Serial.print("Large Value: ");
Serial.println(largeValue);
Serial.print("Casted to int: ");
Serial.println(smallInt);
// AVRの場合、40000は16bit範囲を超えるため負の数にラップする
}
void loop() {}
【活用例】
- アナログ入力のデジタル化:
analogRead()で取得した 0-1023 の範囲の値を、特定単位の整数として扱う際の変換。 - PWM制御の計算: 計算式によって得られた
float型のデューティ比を、analogWrite()に渡すためのint型(0-255)へ変換する処理。 - 時間管理:
millis()関数で取得したマイクロ秒単位の数値を、秒単位の整数へキャストして一定周期の処理を判定する際の処理。


コメント