C言語では、数値型の変数に入っている1を、そのまま画面に表示したり入力結果として扱ったりできる場面があります。そのため「整数の1と文字列の”1″は別のデータなのに、なぜ変換しなくても表示できるのか」と疑問に感じる人も少なくありません。この記事では、C言語における数値と文字列の違い、printfなどの関数が内部でどのように処理しているのかを分かりやすく解説します。
C言語では数値の1と文字列の”1″は別物
まず理解しておきたいのは、C言語では数値型の1と文字列としての”1″は全く異なるデータだということです。
例えば、以下の2つは見た目は同じ1ですが、コンピューター内部では異なる情報として扱われます。
- 整数型の1:数値として値1を保存している
- 文字列の”1″:文字コードで表された文字’1’を保存している
整数の1は計算に利用できますが、文字列の”1″はそのままでは計算には利用できません。例えば、1+2という計算をする場合は数値型の1と2が必要であり、文字列の”1″と”2″では別途変換処理が必要になります。
printfが自動的に文字へ変換している
C言語で数値をそのまま表示できる理由は、printf関数が内部で数値を文字として表示する処理を行っているためです。
例えば、以下のようなコードがあります。
int number = 1;
printf("%d", number);
この場合、numberの中身は整数値の1です。しかしprintfは%dという指定を見て、「この値を10進数の数字として表示する」と判断します。
つまり、プログラム内部では数値の1のまま保持されていて、画面に出力するときだけprintfが文字列の形に変換して表示しています。
画面に表示される文字の1は、実際にはディスプレイや出力装置へ送るための文字データです。プログラム内の数値が直接文字になっているわけではありません。
出力時には必ず文字への変換処理が行われている
コンピューターの画面に文字を表示するためには、最終的に文字コードへ変換する必要があります。ディスプレイは「整数値の1」という情報をそのまま表示しているわけではありません。
例えば整数値の1を表示する場合、内部では次のような流れになります。
- 変数に整数値1を保存する
- printfが%d指定を確認する
- 整数値1を文字コードの’1’へ変換する
- 画面へ文字として出力する
この変換処理をプログラマーが毎回書かなくてもよいように、標準ライブラリの関数が用意されています。
scanfでは逆方向の変換が行われる
入力の場合も同じ考え方です。キーボードから入力される数字は、最初から整数型として入ってくるわけではありません。
例えば以下のコードの場合です。
int number;
scanf("%d", &number);
キーボードで入力した「1」は文字として受け取られますが、scanfは%dという指定を見て、それを整数値1へ変換して変数numberへ保存します。
つまりscanfは文字から数値への変換、printfは数値から文字への変換を担当していると考えることができます。
文字列として扱う場合は明示的な変換が必要
一方で、数値を文字列として保存したい場合は、自動的には変換されません。
例えば以下のような場合です。
int number = 1;
char text[10];
このnumberをtextに入れたい場合は、sprintfなどの関数を使って明示的に変換します。
sprintf(text, "%d", number);
この処理によって、整数値1が文字列”1″として保存されます。このように、表示するだけならprintfが変換してくれますが、データとして文字列化したい場合は自分で変換する必要があります。
型指定子が変換方法を決めている
printfやscanfでは、%dや%sなどの型指定子を使って、どのようなデータとして扱うかを指定します。
| 指定子 | 意味 |
|---|---|
| %d | 整数として扱う |
| %f | 小数として扱う |
| %s | 文字列として扱う |
例えば、整数1に対して%sを指定すると、C言語は文字列の場所を探そうとしてしまうため、正しく動作しません。型指定を間違えると予期しない結果やエラーの原因になります。
C言語は基本的に型を厳密に管理する言語なので、自動的に何でも変換してくれるわけではありません。printfやscanfのような特定の関数が、決められたルールに従って変換しているだけです。
まとめ
C言語で数値型の1を文字列型の1へ変換しなくても表示できるのは、printfなどの出力関数が内部で数値を文字として表示する処理を行っているためです。
プログラム内部では整数の1と文字列の”1″は別のデータですが、入出力処理を担当する関数が必要に応じて変換しています。
そのため、表示だけなら変換を意識する必要はありませんが、文字列として保存したり加工したりする場合には、sprintfやatoiなどの変換処理を明示的に行う必要があります。C言語では「どの場面でどの型として扱われているか」を理解することが重要です。


コメント