- ベストアンサー
C言語で2進数を10進数に変換するプログラムの解説
- C言語で2進数を10進数に変換するプログラムの解説をします。
- C言語のプログラムにおいて、val = binary[pos] - '0';という部分について説明します。
- この行は2進数の桁の値を取得するための操作です。2進数の各桁の値は文字列で表されており、'0'を引くことで対応する数値を得ることができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こう言う場合は、一旦、問題になってる場所をコメントアウトしてみれば良いです。 ちなみに、今問題になってるのは「0って何だ?」って事なんでそこに注目してみます。 元のプログラムを実行して0を入力すると、例えばこう言う結果が返ってきますね。 /* ここから結果 */ 変換前の2進数 = 0 桁の重み1 × 桁の数値0 = 0 変換後の10進数 = 0 /* ここまで */ 2進数の0は10進数の0ですね。当たり前なんでこれは正しい結果です。 さて、じゃあ問題の箇所を次のようにコメントアウトしてみましょう。 /* こう言う風にコメントアウトしてみる */ val = binary[pos]; /* - '0'; */ /* セミコロンを付け忘れないように! */ こうするとbinary[pos]ってのが剥き出しでvalに代入されますね。 これでさっきやったようにコンパイルして実行、そして0を入力してみます。 そうするとどうなるでしょうか。 /* ここから結果 */ 変換前の2進数 = 0 桁の重み1 × 桁の数値48 = 48 変換後の10進数 = 48 /* ここまで */ コナン君なら 「あれれれぇ、おかしいな、0を入力したのに48が返ってきたよ?」 とか言うでしょうね(笑)。 さて、一体何が起こってるのでしょうか。 まず、このプログラムで特徴的なのは入力でgets関数を使ってる辺りですね。 ・C言語関数辞典(gets) http://www.c-tipsref.com/reference/stdio/gets.html んで解説読んで欲しいんですが、実際はC言語には(他の言語で言う)「文字列」って物は厳密には無いんですが、次のように書いてあります。 "gets 関数は標準入力 (standard input) から 1 行分※ 文字列を読み取り,s が指す配列に格納します." つまり、このプログラムで「入力」してるのは、上のサイトの説明を借りると、「数値」を入力してるんじゃなくって「文字列」を入力してるわけです。 コードのこの部分ですよね。 gets(binary); もう一度言いますが、仮にここで「0」と入力しても、要するに「整数型」の0が入力されるわけじゃなくって「文字としての」0が入力されてる、って事です。ここまで良いでしょうか? 問題は、文字としての0と数値としての0が一致してれば良いんですが、さにあらず、文字の基本にASCIIコード表なるものがあって、実は「文字の数値」と、メモリに置かれる実際の数値は次のような対応になってるんです。 ・ASCIIコード表 http://e-words.jp/p/r-ascii.html 文字の0 -> 数値の48 文字の1 -> 数値の49 文字の2 -> 数値の50 文字の3 -> 数値の51 文字の4 -> 数値の52 文字の5 -> 数値の53 文字の6 -> 数値の54 文字の7 -> 数値の55 文字の8 -> 数値の56 文字の9 -> 数値の57 お分かりでしょうか?48って数値はさっき出てきましたね。 つまり、コンピュータでは極論、最期は全部数値になるんですが、「文字」と「文字としての数字(整数)」にはズレがある…要するに「48ズレがある」って事なんです。 従って、単純には、C言語上で「文字の数値」を単なる数値に変換するには48引けば良いわけですね。例えばこのプログラム上では次のように書ける。 /* 文字数値から整数への変換 */ val = binary[pos] - 48; そしてもっと端的にはASCIIでは文字'0'は48と定義されてるので、「次の数式も」意味的には上の数式と同値になるわけです。 /* もっとカッコイイ書き方? */ val = binary[pos] - '0'; まとめます。 gets関数は入力を文字として捉える入力関数で、そのままではASCIIコードに従った数値としてメモリへ格納されます。計算/出力する際に、その「文字としての」数値を単純な一桁の整数に変換しないといけません。 ASCIIコードに従う限り、一桁の数値は全て48、ないしは文字'0'を引くと単純な一桁の整数と一致し、これはよく使われる「文字数値 -> 数値」の変換となっています。
その他の回答 (1)
- wormhole
- ベストアンサー率28% (1626/5665)
>このプログラムにおいて、val = binary[pos] - '0';という部分がよくわかりません。 文字コードに依存する話なのでASCIIの文字コード表など参照して欲しいのですがASCII文字コードだと 文字 文字コード '0' 0x30 '1' 0x31 '2' 0x32 '3' 0x33 ... '9' 0x39 binary[pos]の値が'0'だと '0' - '0' → 0x30 - 0x30 → 0 binary[pos]の値が'1'だと '1' - '0' → 0x31 - 0x30 → 1 というように数字の文字を数値に変換できます。
お礼
詳しい解説ありがとうございます 文字コードが関係していたのでしたか 勉強になりました