C++メモ: signed が使える場所では signed を使え

C/C++ において、signed int が使用できる場所で無理に unsigned int を使おうとすると、思わぬ落とし穴にはまることがあります。

例 (1) signed int と unsigned int の演算結果は unsigned int

int iVal = -1;
unsigned int uiVal = 1;
cout << iVal / uiVal << endl;
実行結果
4294967295 (-1 ではない!)

例 (2) unsigned int に単項演算子の - を付けても unsigned int のまま

unsigned int uiVal = 1;
cout << -uiVal << endl;
実行結果
4294967295 (-1 ではない!)

要するに、計算結果が負の値になる可能性のある整数同士の計算式で unsigned int の変数を使ってはいけないということです。

ちなみに、被演算子の型のどちらかが floatdouble になっていれば、上記のような符号の問題は起こりません。 この辺りの細かい話は、C++ 言語を作ったストラウストラップの著書「プログラミング言語 C++」の算術変換の項を参照するとよくわかります。

よく理解していない人が書いた C++ の書籍には、「unsigned を使える場所では unsigned を使え」と簡単に書いてあったりしますが、この考え方は間違いだということがわかります。 C++ を正しく学ぶには、ストラウストラップの本を読みましょう。 分厚い本ですが、仕事で C++ を使用する人にとってはバイブルともいえる本です。