LAB
研究室
C言語プログラムTIPS
char型のキャストに注意
今日は、就職作品制作時に私が陥った恥ずかしいバグを皆さんに公開しようと思います。
(少しでも参考になれば幸いです・・・)
// char型の-1を終了を示す値として扱う #define ARRAY_END (0xff) // 配列サイズ削減のため、char型でテーブルを定義 char array[] = { 1, 2, 3, 4, ・ ・ ・ ARRAY_END }; bool func(char no) { switch( no ) case 1: // 処理 break; case 2: // 処理 break; ・ ・ ・ case ARRAY_END: return true; } return false; } int main(void) { int cnt = 0; for( ; ; ){ if( func( array[cnt++] ) ){ break; } } return 0; }
このコードですが、予期せぬ動作をします。
なぜなら関数func()内のswitch文の終了を示す「case ARRAY_END:」の箇所に処理が来ないからです。
これはC言語ではswitch文に値を渡すと、暗黙にint型にキャストされるという仕様になっているせいです。
つまり、char型の-1のつもりで記述した0xffが、intに型変換された時点で0xffffffffに符号拡張されてしまうわけですね。
上記例では、int型の4byteをケチってchar型のテーブルを定義したことで、この問題を引き起こしていますが、同じような理由でint型を使用せずにchar型を使用した経験がある方も多いのではないでしょうか。
もし同じようなコードを書く場合は、注意してみてくださいね。
(※処理系により、char型の符号付きが変わります)
CATEGORY
- 製品事例 (7)
- デモプログラム (18)
- プログラムTIPS (41)
- C言語 (5)
- C++ (6)
- C++cording (4)
- Ruby (8)
- VisualStudioの使い方 (3)
- 最適化Tips (5)
- ゲーム開発テクニック (2)
- その他 (7)