Edited at

C/C++ の char は 3種類ある


3種類の char

C/C++ の char が取る値の範囲に注意 に書いたように、char は処理系によって符号つきだったり符号なしだったりします。

…わざわざ日本語で表現しているところがポイントで、これを「 char は処理系によって signed char だったり unsigned char だったりします」というと嘘になってしまいます。

実は char は符号つきだろうと符号なしだろうと、 signed charunsigned char とは別の型なのです。

つまり char の仲間には


  • char

  • signed char

  • unsigned char

の3種類の型があることになります。

これに対して、intsigned 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 でやると以下のエラーになります。 intsigned 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++ のオーバーロードとかかテンプレートあたりかな…)

何か面白い事例があったら教えてください。