【C言語】数字⇔数値の変換方法

数字と数値の変換方法の解説ページアイキャッチ

このページにはプロモーションが含まれています

このページでは、数字を数値に変換する方法及び、その逆変換を行う方法、すなわち数値を数字に変換する方法について解説していきます。

ここでいう “数字” とは、整数を文字で表現したものです。

より具体的には、C言語 で '0''7' などの整数がシングルクォーテーションで囲まれたものが、このページで扱う “数字” になります。

これらの変換方法を学ぶことで、例えば下記のような変換を行うことができるようになります。

  • 数字の '0' を数値の 0 に変換する
  • 数字の '7' を数値の 7 に変換する
  • 数値の 0 を数字の '0' に変換する
  • 数値の 7 を数字の '7' に変換する

数字から数値への変換においては、このページではあくまでも数字の “文字” を数値に変換する方法について解説しています。

数字の “文字列” を数値に変換する方法については下記ページで解説していますので、数字の “文字列” の変換について知りたい方は下記ページを読んでいただければと思います。

文字列の数値への変化方法の解説ページアイキャッチ 【C言語】文字列を数値に変換する方法(atoi・strtol など)

数字を数値に変換する方法

数字を数値に変換する方法は至って簡単です。

その方法とは「数字から '0' を引く」です。これだけです。

例えば下記の処理では、数字 '8' から数値 8 に変換する処理になります。printfnum を表示すると 8 が表示されます。

数字の8を数値の8に変換
int num;

/* '8'を8に変換 */
num = '8' - '0';

/* 結果の表示 */
printf("%d\n", num);

また、下記の処理では、数字を格納した変数 suuji を数値に変換する処理になります。下記ではsuuji'7' を格納していますので、数値の 7 に変換されることになります。

変数を数値に変換
char suuji;
int num;

suuji = '7';

/* suujiを数値に変換 */
num = suuji - '0';

/* 結果の表示 */
printf("%d\n", num);

さらに下記は、'0''9' の文字を格納した配列の各要素を数値に変換する処理になります。実行すれば、各要素が数値に変換された結果が1つずつ表示されます。

文字の配列を数値に変換
char array = {
    '0', '1', '2', '3', '4',
    '5', '6', '7', '8', '9'
};
int num;
int i;

for (i = 0; i < 10; i++) {

    /* arrayの第i要素を数値に変換 */
    num = array[i] - '0';

    /* 結果を表示 */
    printf("%d,", num);
}

printf("\n");

下記の処理では、文字列 "9876543210" の各文字を数値に変換する処理になります。実行すれば、各文字が数値に変換された結果が1つずつ表示されます。

文字列の文字を数値に変換
char str[11] = "9876543210";
int num;
int i;

for (i = 0; str[i] != '\0'; i++) {

    /* strの第i文字を数値に変換 */
    num = str[i] - '0';

    /* 結果を表示 */
    printf("%d,", num);
}

printf("\n");

上記の例より、'0''9' の数字は全て '0' を引くだけで数値に変換することができることが確認できると思います。

数値を数字に変換する方法

続いて数値を数字に変換する方法ですが、これは先ほどとは逆に「数値に '0' を足す」になります。これも簡単ですね!

例えば下記は、数値 09 を数字 '0''9' に変換する例になります。

str[0]str[10] には数値 09 の変換結果である数字 '0''9' がそれぞれ格納され、 str[11] に文字列の終端を表すヌル文字 '\0' を格納しているので str は文字列として扱うことができ、最後の printf での表示結果は "0123456789" となります。

数値を数字に変換する
int array[10] = {
    0, 1, 2, 3, 4,
    5, 6, 7, 8, 9
};
int i;
char str[11];

for (i = 0; i < 10; i++) {
    str[i] = array[i] + '0';
}
str[11] = '\0';

printf("%s\n", str);

スポンサーリンク

数字を数値に変換できる理由

では、なぜ数字から '0' を引いたり数値に '0' を足すことで、数字から数値の変換と数値から数字への変換を行うことができるのでしょうか?次はこの理由について解説していきたいと思います。

文字に足し算や引き算が行える理由

まずは、文字に対して足し算や引き算が行える理由について解説します。

C言語では、実は 'A''x' など、シングルクォーテーションで囲まれた文字は全て整数として扱われます。

これは、下記のような処理により確認できると思います。

整数の表示
char result;

printf("%d\n", 'H');
printf("%d\n", 'z');

result = 'z' - 'H';
printf("%d\n", result);

まず最初の printf'H' を表示していますが、この表示結果は 72 となります。さらに、次の printf'z' を表示していますが、表示結果は 122 となります。

さらに、'H' と 'z' はそれぞれ 72122 ですので、'z' - 'H' の計算結果を表示する最後の printf では 50 と表示されます。

なぜ文字が整数で表示されるかというと、printf の変換指定に %d を指定しているからです。printf の変換指定に %c を指定すると、いつも通り文字を表示することができます。

逆に、整数を printf の変換指定に %c を指定して表示すると、文字を表示することが可能です。

文字の表示
printf("%c\n", 72); /* Hが表示される */
printf("%c\n", 122); /* zが表示される */

要はですね、表示の仕方によって文字として表示することも可能なのですが、'A''x' など、シングルクォーテーションで囲まれた文字の実体は数値なのです(もっと正確にいえば、0 or 1 で表される2進数の値)。

例えば、'H' の実体は 72 です。で、これを “文字として” 表示することで 'H' と表示されるだけです。

文字の実体は数値なので、文字に対して演算を行うことができます。当然足し算や引き算を行うことも可能です。

以上が、文字に対して足し算や引き算を行うことができる理由になります。

'0' を足したり引いたりするだけで変換できる理由

さらに、先ほど 'H' と 'z' の値を表示した際、これらの値は異なる結果となりました(72122)。

当然ですが、それぞれの文字を異なるものとして扱えるよう、文字ごとに異なる値が割り振られています。この割り振られている値を、その文字に対する “文字コード” と言います。

で、ここからが本題で、数字の場合は下記のように '0' から順に連番で文字コードが割り振られています。

  • '0'48
  • '1'49
  • '2'50
  • '3'51
  • '4'52
  • '5'53
  • '6'54
  • '7'55
  • '8'56
  • '9'57

この文字コード自体は覚える必要はないです。

重要なのは、各数字と '0' との関係性です。上記を '0' との値の差の観点で書き換えると、下記のようになります。

  • '0''0' + 0
  • '1''0' + 1
  • '2''0' + 2
  • '3''0' + 3
  • '4''0' + 4
  • '5''0' + 5
  • '6''0' + 6
  • '7''0' + 7
  • '8''0' + 8
  • '9''0' + 9

上記を見ればわかるように、全ての数字は '0' + その文字の数値 の文字コードが割り振られていることになります。

ですので、数値に '0' を足せば、その数値を数字の文字に変換することができます。

逆に、数字から '0' を引けば、その数字の文字を数値に変換することができることになりますね!

つまり、数字に対して '0' を引くだけで数値に変換できる理由、及び、数値に対して '0' を足すだけで数字に変換できる理由は、各数字の文字コードが '0' + その文字の数値 として割り振られているからになります。

ちなみにですが、前述の通り '0' の文字コードは 48 ですので、例えば 数字を数値に変換する方法 で紹介した全ての処理は、- '0'- 48 に置き換えても同じ結果を得ることができます。

なので、数字を数値に変換する方法は「数字から 48 を引く」と考えても差し支えありません。

ただ、48 という値を覚えておくのは大変ですし、ソースコード中にいきなり 48 と書いてあると他の人が読んだときになんの数値か分かりにくくなるので、48 ではなく '0' を引くようにした方が良いと思います。

スポンサーリンク

まとめ

このページでは、「数字を数値に変換する方法」と「数値を数字に変換する方法」ついて解説しました!

解説の通り方法は簡単で、下記を行うことでこれらの変換行うことができます。

  • 数字を数値に変換する:数字から '0' を引く
  • 数値を数字に変換する:数値に '0' を足す

こんな感じで、文字を整数として扱うことができることを知っていれば、文字に対していろんな変換を行うことが可能です。

例えば、下記ページでは文字への足し算や引き算を行うことで大文字小文字変換を行う方法について解説しています。このページが参考になったのであれば、下記ページも参考になると思いますのでぜひ読んでみてください!

C言語での大文字 ⇔ 小文字変換の方法を解説

また、文字ではなく、文字列を数値に変換したい場合は、atoi 関数や strol 関数を利用するのが簡単だと思います。これらの関数については下記ページで解説していますので、文字列を変換する際は是非こちらのページを参考にしていただければと思います。

文字列の数値への変化方法の解説ページアイキャッチ 【C言語】文字列を数値に変換する方法(atoi・strtol など)

オススメの参考書(PR)

C言語学習中だけど分からないことが多くて挫折しそう...という方には、下記の「スッキリわかるC言語入門」がオススメです!

まず学習を進める上で、参考書は2冊持っておくことをオススメします。この理由は下記の2つです。

  • 参考書によって、解説の仕方は異なる
  • 読み手によって、理解しやすい解説の仕方は異なる

ある人の説明聞いても理解できなかったけど、他の人からちょっと違った観点での説明を聞いて「あー、そういうことね!」って簡単に理解できた経験をお持ちの方も多いのではないでしょうか?

それと同じで、1冊の参考書を読んで理解できない事も、他の参考書とは異なる内容の解説を読むことで理解できる可能性があります。

なので、参考書は2冊持っておいた方が学習時に挫折しにくいというのが私の考えです。

特に上記の「スッキリわかるC言語入門」は、他の参考書とは違った切り口での解説が豊富で、他の参考書で理解できなかった内容に対して違った観点での解説を読むことができ、オススメです。題名の通り「なぜそうなるのか?」がスッキリ理解できるような解説内容にもなっており、C言語入門書としてもかなり分かりやすい参考書だと思います。

もちろんネット等でも色んな観点からの解説を読むことが出来ますので、分からない点は別の人・別の参考書の解説を読んで解決していきましょう!もちろん私のサイトも参考にしていただけると嬉しいです!

入門用のオススメ参考書は下記ページでも紹介していますので、こちらも是非参考にしていただければと思います。

https://daeudaeu.com/c_reference_book/

同じカテゴリのページ一覧を表示