
[code]

    using System;
    class aaaaaa
    {
        static void Main()
        {
            double x, y;
    
            byte b;
            int i;
            char ch;
    
            x = 10.0;
            y = 3.0;
    
            i = (int)(x / y);//double型からint型へのキャスト
            Console.WriteLine("Integer outcome of x / y:" + i);
    
            i = 100;
            b = (byte)i;
            Console.WriteLine("Value of b:" + b);
    
            i = 257;
            b = (byte)i;
            Console.WriteLine("Value of b: " + b);
            b = 88;
            ch = (char)b;
            Console.WriteLine("ch:" + ch);
        }
    }
    
[/code]

わからないのは最後の行です  
ここでビルドすると ch:xになるのですが、なぜxになるのでしょうか？

また、charは文字を一文字だけ保持する役割だと知りましたが、これの存在意義はあるのでしょうか。


CC BY-SA 3.0
2015-03-08T13:56:18.030
7621
2015-03-09T03:55:17.300
2015-03-08T13:59:04.493
5337
8269
question
c#
char型について


前提としてコンピューター上の情報は基本的に0/1の2状態(ビット)の組み合わせで表されます。`char`は16ビットで0～65535の数値を表しており、それぞれの整数に文字が割り振られています(UTF-16)。これらの`char`を複数個配列に格納した型が文字列型の`string`です。このような事情でコンピューター上での文字列表現には文字型が不可欠です。

`char`型は`ToString`をオーバーライドしており、前述のUTF-16に対応する文字を含んだ`string`を返すようになっています。なので文字列結合の+演算子を使うと`char`は数値ではなく文字になります。


CC BY-SA 3.0
2015-03-08T14:38:58.823
7623
2015-03-08T14:38:58.823
5750
7621
answer


## Chが”X”になる理由

なぜ、整数を、代入したのに、char型にキャストしたら”X”になるのかという理由から先に。  
char型はご理解の通り、文字を１文字だけ表現する型(*1)なので、コンソールへの出力時に、入力した”88”(*2)をユニコードとして解釈し、ユニコードの”88”に該当する大文字の”X”を出力したからです。  
“88”(*2)と言う値を、どのように評価するかは型によって変化します。なので、逆に

[code]

    int i=(int)'X';
    Console.WriteLine(i);
    
[/code]

このように書いたとき、“88”が出力されます。

(*1)このあたり実はそう簡単にはいかないです。char型２つで1つの文字を表現することもあります。  
(*2)便宜上、“88”という10進数を使っていますが、本来的にはメモリに格納された値そのものと言うことでご理解ください。

* * *

## char型の存在意義

文字を扱うのに長けたstring型があるのに、なぜchar型が又別に存在しているのかという御疑問だと思います。  
char型の方が効率的に処理できる場合があり、代表的な使いどころとして、

  1. 1文字しか対象としない
  2. 上と被りますが、文字列を1文字ずつばらして操作する際に利用する

あたりで使うことがあります。  
若干、込み入った話になりますが、string型は参照型、char型は値型、と言う大きな違いがあります。  
参照型の場合、マネージヒープにその実体が置かれますので、ガーベージコレクタに余計に仕事をして貰う必要が出てきます。他方、char型は値型なので、一般的な使い方をしていれば、マネージヒープを利用しないので、ガベージコレクタは余計な仕事をしなくても済みます。  
処理粒度が比較的にでかくてこの辺のオーバーヘッドを気にする必要が無い場合もありますが、処理粒度の比較的軽いモノたとえば、stringのIndexOfメソッドや、Replaceメソッドの場合は、処理にかかるコストと参照型を使うオーバーヘッドにかかるコストがコトによっては一緒になってしまうか、最悪の場合逆転しかねないシナリオもあります。  
なので、ここいらには、string型とchar型のオーバーロードがわざわざ存在しているのにはその辺の理由なのではないかと個人的には思っています。

同様に、文字列を一文字ずつ分解して処理したい場合も、一文字の文字列として処理するより、char型として処理した方が効率が良くなります(*3)

(*3)但し、先に示したとおりcharが2つで1文字になる場合もあり得ますのでその辺は注意が必要になります。


CC BY-SA 3.0
2015-03-08T14:49:20.600
7624
2015-03-08T15:02:21.277
2015-03-08T15:02:21.277
7287
7621
answer