- 締切済み
c言語についての質問です。
charの代わりにintを使える意味が分かりません。 char c ='A' char c =65が同じなのはなぜですか? char c='A' とint c='A'が同じなのはなぜですか? こんがらがってパンクしそうです 助けてください。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- jjon-com
- ベストアンサー率61% (1599/2592)
コンピュータ内では,数値も文字も命令も音声も画像もあらゆるものが0と1を組み合わせたbit列で表現されています。 10進数の65を,8bit長で表現すると,01000001です。 ASCII文字コードの'A'を,8bit長で表現すると,これも同じく01000001です(回答No.4,No.5で紹介されているリンク先を参照) charは,8bit長のデータ型です。文字(character)しか格納できないわけではなく,数値も文字も命令も音声も画像も,8bit長で収まるのであればどんなものでも格納できます。なぜって,数値・文字・命令・音声・画像というのはそれをどう解釈したかという結果の違いであり,コンピュータにとってはあらゆるものが0と1を組み合わせたbit列なので。 char c = 65; と書くと,8bit長の変数cには次のbit列が格納されます。 01000001 intは,32bit長のデータ型です(16bit長の場合もあります)。整数(integer)しか格納できないわけではなく,32bit長で収まるのであればどんなものでも格納できます。 int c = 'A'; と書くと,32bit長の変数cには次のbit列が格納されます。 00000000 00000000 00000000 01000001 -------- 「アルファベットの1文字が8bit長で表現できるのだから,1文字はあくまで1バイト(8bit)とする。漢字を使っている輩は,(私たち欧米人の)文字単位を複数並べて(漢字圏の)1文字を扱えばいい」 という方針は,ソフトウェアの国際化によって過去のことになり, 現代での基本方針は次のようになります。 「非アルファベット圏であっても1文字は1単位のデータとして扱えるべき。したがって国際化された1文字は8bit長以上のデータ型で扱うことになる」 プログラム言語の仕様は過去との互換性を維持する必要があるので,intという名を勝手に変えるわけにはいかないのですが,現在ではint型は文字を格納するためにも用いられています。
- duke_kimura
- ベストアンサー率39% (53/134)
パソコンの基礎知識がないと理解できない事柄なので「こんな感じ」で説明しますね。 厳密に言うと、この説明は間違っています。 >> char c ='A' >> char c =65が同じなのはなぜですか? ざっくりというとパソコンの中にある計算機は数字しか扱えません。なので'A'は、最終的には65として扱われます。 65 = 'A'というのは取り決めで決まっていて(参考URL参照)、意味の分からない65として書くか、人間の目で見て分かる'A'で書くかは、書く人の感性の違いです。 >> char c='A' とint c='A'が同じなのはなぜですか? C言語では機械の言葉に近い部分、エラーになるような言語は人間の言葉に近い部分に重きを置いていて、上で述べたように機械で扱う時の内容はどちらも数字の65になりますので、この2つの命令はC言語ではエラーとして扱われません。 じゃあ何が違うのかというとメモリに配置される時の領域の大きさで、例えば次の様になります。 char → 「65」 int → 「00 00 00 65」
- XenoneX
- ベストアンサー率85% (12/14)
そもそも、charというのはintよりも扱える数値の範囲が狭いというだけの型なのです。 char c = 'A' と char c = 65 は見た目こそ違いますが、内部では同じ行動をとっています。普通変数に何かを代入するときは、たとえそれが文字であっても、数字で保存されています。この例だと、'A'が代入された場合には65を代入しているわけです。この関連付けはASCIIコードというものに記されています。 http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html printf("%d\n", c) とすれば、cに保存されている数字(65)をそのまま出力し、 printf("%c\n", c) とすれば、cに保存されている数字を文字(A)に変換してから出力します。 じゃあintで対応できるのに何でcharなんかあるのかということになりますが、そこは文字列などを扱うのに必要になってくるからです。最初のうちはintで代用できてしまうので存在価値がわかりませんが、学ぶにつれて必要性が分かってくるかと思います。
- kmee
- ベストアンサー率55% (1857/3366)
int i=127 と書くのと int i=0x7f と書くのと int i=0377 と書くのとで 全部同じ値になる、というのはわかりますか? これらは、同じ数値の表現方法を変えたものです。 'A'というのも、これらの「整数を表現する方法」の一つです。 'A' は「'A'という文字を表わす数値」です。 C言語には、厳密に言えば「文字」はありません。 必要に応じて、整数を文字として扱っているのです。 char c ='A'; printf("%c",c) ; で、'A'と出力されるのは、%cが「整数が表わす文字に変換する」というものだからです。 整数なので、int型でも使えます。charよりintの方が範囲が広いので、 int i='A' ; としても、情報は失われません。 > char c ='A' > char c =65が同じなのはなぜですか? 正確に言うと、違う場合がります。 'A' はASCIIコードでは65です。なので、 c='A'と書くことと、 c=65 と書くことは同じことです。 しかし、ASCII以外にも、文字コード系はたくさんあって、なかにはASCIIとまったく違うものもあります。 例: EBCDIC その場合、65にはなりません。 > char c='A' とint c='A'が同じなのはなぜですか? これも正確には同じではありません。メモリ上の表現が変わることがあります。 char c='A' とした場合、char分の領域だけ(一般には8bit)使って、'A'に相当する数値が記憶されます。 int c='A' とした場合、int分の領域だけ(例えば、int型が32bitあるなら、その32bit)使って、'A'に相当する数値が記憶されます。
- Tacosan
- ベストアンサー率23% (3656/15482)
むしろ コンピュータ内部では文字も数値で表される と言った方がよいかも>#1. ちなみに質問に挙がっている char c ='A'; と char c =65; は, 必ずしも同じではありません.
- asuncion
- ベストアンサー率33% (2127/6290)
char型というのは、「文字」を扱う型というよりも、 「int型よりもせまい範囲を扱う整数型」であると考えるのが よいと思います。