usual arithmetic conversions

今日はドキュメントの修正をしつつ、インタフェースの調整をしていました。
特に、チャンネル数やサンプリング周波数を表現する整数型がバラバラだったので、ある程度統一しました。
自分は、負の値を取らない整数には(0以上の保障ができる)unsignedやstd::size_tを使うことが多いのですが、これはあまり良くないかもしれません。


整数型は演算の前に通常の算術変換(usual arithmetic conversions)が行われます。
通常の算術変換というのは、演算の左右の項の型を揃えることです。(ISO/IEC 14882:2003 5/9)
(浮動小数点数を考えずに)大まかに説明すると、左右の項に汎整数昇格を行い、片方の型がもう一方の型の全ての値を表現できる場合はその型に合わせ、そうでない場合は符号なしの型に合わせるというものです。
これ自体は多くの場合うまく機能するのですが、負でないからunsignedにしたというケースでは無駄なキャストが多くなります。
unsignedを使うのは、

  • signedでは精度が足りない場合
  • ビット演算を行う場合
  • 想定される演算対象がunsignedである場合

に留めた方がよさそうです。
その分、範囲チェックやassertを強化しようと思います。