Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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++ のオーバーロードとかかテンプレートあたりかな…)
何か面白い事例があったら教えてください。

kojiohta
某電機メーカーで組み込み系エンジニアやっています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away