まくまくC/C++ノート
signed が使える場所では signed を使え
2008-04-22

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

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

int iVal = -1;
unsigned int uiVal = 1;
cout << iVal / uiVal << std;

実行結果:

4294967295 (-1 ではない!)

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

unsigned int uiVal = 1;
cout << -uiVal << endl;

実行結果

4294967295 (-1 ではない!)

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

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

</table> よく理解していない人が書いた C++ の書籍には、「unsigned を使える場所では unsigned を使え」と簡単に書いてあったりしますが、この考え方は間違いだということがわかります。 C++ を正しく学ぶには、ストラウストラップの本を読みましょう。 分厚い本ですが、仕事で C++ を使用する人にとってはバイブルともいえる本です。
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

プログラミング言語C++第4版 C++11対応 [ ビャーン・ストラウストラップ ]
価格:9504円(税込、送料無料) (2017/6/6時点)

2008-04-22