恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

文字は数値であることの再確認(char型、int型)

アルファベット等の文字は内部的には数字で表現されているという話を聞いたことがあると思います。

文字が数字で表現されているから、その値(数値)を増やしたり減らしたりすることで、画面に出力する文字を変えることができるという理屈になります。

なお、この話はchar型が小さな整数値を扱えるという話ともリンクしています。

 

以上のことをコードで再確認してみました。

 

#include <stdio.h>

int main(void)
{
    char c;

    for (c = 'A'; c <= 'Z'; c++)
        printf("%c ", c);

    printf("\n");

    for (c = 'a'; c <= 'z'; c++)
        printf("%c ", c);

    return 0;
}

 

コードの実行結果は以下のとおりです。

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z

 

このコードでは、char型の変数「c」に文字(「A~Z」と「a~z」)を代入しています。この際、c++」 でインクリメントできていることから、内部的に数値として扱われている匂いが漂っていますね^^。

 

同じことをint型の変数を利用して行ってみます。

#include <stdio.h>

int main(void)
{
    int i;

    for (i = 0; i <= 25; i++)
        printf("%c ", 'A' + i);

    printf("\n");

    for (i = 0; i <= 25; i++)
        printf("%c ", 'a' + i);

    return 0;
}

 

コードの実行結果は以下のとおりです。

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z

 

このコードでは、printf文の中で最初のアルファベット(A または a)にint型の数値「i」 を足しています。足す数値を「 i++」 で大きくすることによりprintf文で出力されるアルファベットが変化していますね。

 

具体的には、

A + 0 は A
A + 1 は B
A + 2 は C

という感じで Z まで続いています。 

このことからも、文字(ここではアルファベット)と数値がリンクしていると言えそうです。

 

今度は、アルファベットをASCIIコード(数値)で出力してみましょう。
やることはフォーマット指定子を %c から %d に変えるだけです。
(%3d の 3 は3桁幅で出力するためのものです)

#include <stdio.h>

int main(void)
{
    char c;

    printf("A~ZのASCIIコード\n");
    for (c = 'A'; c <= 'Z'; c++)
        printf("%3d ", c);

    printf("\n\na~zのASCIIコード\n");
    for (c = 'a'; c <= 'z'; c++)
        printf("%3d ", c);

    return 0;
}

 

このコードの実行結果は以下のとおりです。

A~ZのASCIIコード
 65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90

a~zのASCIIコード
 97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

 

この結果から、

A + 0 は A
A + 1 は B
A + 2 は C

というのは、以下のようになっていたと分かります。

65 + 0 は 65    // これが A
65 + 1 は 66    // これが B
65 + 2 は 67    // これが C

 

念のため、再確認。

#include <stdio.h>

int main(void)
{
    char c = 'A';
    printf("AのASCIIコードは %d ", c);

    return 0;
}

このコードを実行すると

AのASCIIコードは 65

と表示されました。

 

余談

 アルファベットのASCIIコードを出力した際、大文字と小文字の差が「32」でしたね。

 A → 65
 a → 97

 Z → 90
 z → 122

ということは、32を加えたり差し引いたりすることで、大文字を小文字に変換したり、小文字を大文字に変換したりできそうです。

ただ、C言語にはtoupper関数やtolower関数があるので、そちらを使えば済む話ですが。(これらの関数を使う場合は、ctype.hをインクルードする必要があります。)