57
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-13

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

57
36
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
57
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?