3種類の char
C/C++ の char が取る値の範囲に注意 に書いたように、char は処理系によって符号つきだったり符号なしだったりします。
…わざわざ日本語で表現しているところがポイントで、これを「 char は処理系によって signed char だったり unsigned char だったりします」というと嘘になってしまいます。
実は char は符号つきだろうと符号なしだろうと、 signed char や unsigned char とは別の型なのです。
つまり char の仲間には
charsigned charunsigned char
の3種類の型があることになります。
これに対して、int は signed int と同じ型なので int / unsigned int の 2種類です。わかりにくい…。
オーバーロード
これは C++ のオーバーロードで別の型として扱われることでも確認できます。
# include <cstdio>
void func(char) {
puts("char");
}
void func(unsigned char) {
puts("unsigned char");
}
void func(signed char) {
puts("signed char");
}
int main() {
char c = 0;
unsigned char uc = 0;
signed char sc = 0;
func(c);
func(uc);
func(sc);
}
結果は
char
unsigned char
signed char
となりました。
ちなみに同じことを int でやると以下のエラーになります。 int と signed int が同じ型であることがわかりますね。
overload.cc: In function ‘void func(int)’:
overload.cc:9:6: error: redefinition of ‘void func(int)’
void func(signed int) {
^~~~
overload.cc:3:6: note: ‘void func(int)’ previously defined here
void func(int) {
^~~~
それで ?
特にこれを積極的に使うケースは思いつきませんが、いつかよくわからない挙動でハマったときに役に立つことがあるかもしれません。(C++ のオーバーロードとかかテンプレートあたりかな…)
何か面白い事例があったら教えてください。