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

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

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)処理が行われる。四捨五入は行われない。

【技術的特徴】

  1. プラットフォーム依存性:
    Arduinoはクロスプラットフォームな環境であるため、int のビット幅はハードウェアに依存する。ポータビリティを重視するコードでは、この差異を考慮する必要がある。
  2. 整数昇格(Integer Promotion):
    C++の規則に基づき、計算過程においてより小さな整数型(char, short 等)は、演算の際に自動的に int 型へと昇格される。
  3. オーバーフロー挙動:
    変換後の値が 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() 関数で取得したマイクロ秒単位の数値を、秒単位の整数へキャストして一定周期の処理を判定する際の処理。

コメント

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