質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

1364閲覧

int型、char型、文字コードの意味の確認

yuruyuru

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/06/09 21:27

独学で学んでいるため自分の理解が合っているのかを確認したく質問させていただきました。
間違っている解釈があればご指摘いただけると嬉しいです。
言語はC言語です。

①int型・・・4バイトのメモリ領域を確保
②char型・・・1バイトのメモリ領域を確保
③ASCII・・・文字コード
④ASCIIのコード表より
'a'=97
⑤97・・・コード
⑥int buf="a";
でエラーが起きるのはダブルクォーテーション(文字列リテラル)で文字列を表しそこには終端文字が付加されるため領域足りないから。
⑦int buf='a';
シングルクウォーテーションで文字コードを表すためbufには97を二進数に変換し32ビットの領域に格納される。
⑧これらの基本解釈はその他の言語(PHP,Javsなど)に関しても適応される

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

①int型・・・4バイトのメモリ領域を確保

Cの規則では、int型は少なくとも-32767~32767の範囲を表せること、としか決まっていません。8bitや16bitのCPUではint型は2バイトが普通です。

③ASCII・・・文字コード

文字コード「の一種」の名前というところでしょうか。ASCII以外にも文字コード体系はあります。

⑤97・・・コード

どう解釈しましょう? 97は97という値でしかありません。それにどういう意味を見出すかはプログラム次第。あなたが文字コードを扱うプログラムを書いているのならそれは正しいですし、97円の商品を買うのに100円玉一個でお釣りはいくら? という計算の過程での97なら"コード"ではないです。

⑥int buf="a";

でエラーが起きるのはダブルクォーテーション(文字列リテラル)で文字列を表しそこには終端文字が付加されるため領域足りないから。

もしそれが「エラー」になるとしたらCではなくC++として扱っている可能性もあります。確認してください。
それはそれとして、その解釈は間違い。
"a"は、メモリ上のどこかに'a''\0'という文字列を作成して'a'のアドレスがその値となります。
bufは数値型で、"a"の値はアドレスなので、型の違う値を代入しようとしているのでC++ではエラーになります。Cは型の扱いに鷹揚なので、なにもお咎め無しで通ることもありますし、コンパイラの設定によっては警告やエラーが出るかも知れません。なお、Cではアドレス値はint型に変換できることになっています。C++でも多分、明示的に変換を指示すれば変換できるはず。

⑦int buf='a';

シングルクウォーテーションで文字コードを表すためbufには97を二進数に変換し32ビットの領域に格納される。

@@@@@
@はいくつありますか? 10進数でなら5と表しますし、2進数では101と表しますが、決して「変換」されるものではありません。
2進数ってのは、10進数とは全く異なるナニカがあるわけではありません。赤い果物をリンゴと呼ぼうとappleと呼ぼうと、その果物の実体は変わらないのと同様。あなたは目の前にあるリンゴをappleに「変換」できますか? あなたができるのは、あなたがその果物をなんと呼ぶかを変えることだけでしょう。

ところで、C言語では、'a'はそもそもint型で文字aを表す文字コードの値の表記方法です。ASCIIコードを採用しているなら
int buf=97;
と書くのとなんら変わりません

⑧これらの基本解釈はその他の言語(PHP,Javsなど)に関しても適応される

Cの文法規則はCにしか「適用」(x適応)されません。ただ、Cの影響は大きいので、後発の言語がCに寄せている、ということはあるかも知れません。

投稿2021/06/09 23:33

編集2021/06/09 23:36
thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuruyuru

2021/06/10 00:47

97には特に名前はついていないのですね。 ⑥に関しては警告が出ていました。 他の方もおっしゃっているようにアドレスが代入されていると言うことですね。ありがとうございます。 10 進数で5、2進数で101というのは2で割った商と余りで変換することができると思うのですが、、 int buf=97;と int buf='a';が同じ意味だと言うことは理解しています。その97(10進数)がbit単位で保存されるときは1か0で表す二進数に変換する処理が見えないところでされているのではないでしょうか。 ⑧に関して回答ありがとうございます。
thkana

2021/06/10 02:58

警告とエラーは意味も対処も異なるので、厳密に区別してください。 警告は、もしプログラマが大丈夫と保証するなら放置することも可能です。といって放置を推奨するわけではありませんが。多くの警告は適切に対処すれば無くすことができます。 一方、エラーは「誤り」、コンパイラが解釈を続行できないということなので、直さない限りプログラムは実行できません。 > 変換することができる う~ん、通じてないですね。 10進数とか2進数というのは表記の仕方の問題であって「変換」するものじゃない、ということなのですが。 > 二進数に変換する処理が見えないところでされている (「変換」ではありませんが) ソース上にあるのは'a'という文字リテラル。それをコンパイラにかけた段階でそれは「バイナリ」2進数表記でオブジェクトファイルに出力されます。2進数表記になるのはコンパイルの段階である、というのが知りたいことなのですか? そこは抽象化されているのであまり気にするところではないのですが。
yuruyuru

2021/06/10 04:21

了解です。以後気をつけます。 2進数の101は2^2+2^0=5(10進数) また、5/2=2...1 2/2=1...0 1/2=0...1 余りを使って101と表すことができる これは変換ではないのでしょうか。 基本情報を学んでいた時も参考書には2進数を10進数で表す、変換するという言葉が使われていました。 おそらく自分が知りたいというか書いているのはそこです。 10進数ソース上で表記されているものが2進数表記になるというのは10進数で表されていたものが2進数に変換された、という解釈でいいと思うのですが違うのでしょうか。それとも何か対応する表みたいなのがあってそれを参照しているということでしょうか。
thkana

2021/06/10 05:44

> 何か対応する表みたいなのがあってそれを参照しているということでしょうか。 ではなくて、10進数で5は2進数では101、3進数なら12で4進数なら11と「同じもの」である、というだけのことです。なにも「変換」していません。 97という数値をコンピュータは01100001という記法で記憶する、ということならそのとおりです。 そして、97(10)と01100001(2)は同じもの、です。97(10)-01100001(2)は0です。変換したのに同じものって、変でしょ?
guest

0

ベストアンサー

①int型・・・4バイトのメモリ領域を確保

コンパイラによって異なります。

⑥int buf="a";

でエラーが起きるのはダブルクォーテーション(文字列リテラル)で文字列を表しそこには終端文字が付加されるため領域足りないから。

"a"の型は(const) char[]なので、が異なります。メモリサイズがどうであれ、そのままの代入は成立しません。

⑧これらの基本解釈はその他の言語(PHP,Javsなど)に関しても適応される

されないものも多いです。たとえば、Javaでは文字列はすべてUTF-16として動きますし、PHPでは'a'"a"も全く同じ、文字列の値となります。

投稿2021/06/09 22:26

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuruyuru

2021/06/09 22:44

その他の言語でも基本的なところから違うということも珍しくないのですね。 ありがとうございます。理解できました。
maisumakun

2021/06/09 23:44

あと、C言語では特定の文字コードを使うことも要求していません(EBCDICという、ASCIIと全く別系統の文字コードで動く環境もあるとのことです)。 C言語が文字コードに対して行う要求は、コード0の文字(ヌル文字)が制御コードとして存在することと、'0'~'9'の文字が連続して存在すること、というようにかなり少ないです。
guest

0

全体として、コンパイラが行う処理と、金比羅が出力したオブジェクトコードが実行することの区別が付いていらっしゃらないのが気になります。

  • ①int型・・・4バイトのメモリ領域を確保

大きさは4バイトとは限りません。
また、extern宣言の場合は、メモリ領域は確保しません。」

-「'a'=97」の等号と、「int buf="a";」の等号は意味が違うことを理解してください。

  • bufには97を二進数に変換し32ビットの領域に格納される。

'a'を数として解釈するのはコンパイラです。
二進数というのは数の表現であって数自体には二進数も十進数もありません。したがって変換という言葉自体に意味がありません。

  • ⑧これらの基本解釈はその他の言語(PHP,Javsなど)に関しても適応される

世のなかには多くのプログラミング言語があり、そもそも型がなかったり、データには型があるけれども変数には型がなかったりします。
私の知る限りでは、COBOL FORTRAN LISP PROLOG SmallTalk BASIC sed awk PASCEL perl ruby Pythonなどでは全く当てはまりません。

投稿2021/06/09 23:04

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuruyuru

2021/06/09 23:23 編集

すいません、自分の説明不足でした。 ‘a’=97では等しいという数学的な使い方、int buf="a";ではプログラミングで使用される代入という使い方という意味でした。 実行されるときのメモリ内の動きとしては32bitには0または1が格納されるため10進数で97、それが2進数の01100001に変換されて格納されるのではないでしょうか。 そうなのですね全ての言語になんらかの共通点はあると勝手に思っていたのですが勘違いでした。
guest

0

①int型・・・4バイトのメモリ領域を確保

既に回答のある通り。

②char型・・・1バイトのメモリ領域を確保

これはそう。

③ASCII・・・文字コード

いいえ。「文字セット(文字集合)」または「文字コード体系」「エンコーディング(文字と、文字コードの対応関係を定めたルール)」です。

④ASCIIのコード表より
'a'=97

はい。

⑤97・・・コード

数値、もしくは、aの文字コード

⑥int buf="a";
でエラーが起きるのはダブルクォーテーション(文字列リテラル)で文字列を表しそこには終端文字が付加されるため領域足りないから。

いいえ。領域は2バイトあれば良いので足りています。
文字列リテラルはcharの配列なので、型が異なるのでエラー。

⑦int buf='a';
シングルクウォーテーションで文字コードを表すためbufには97を二進数に変換し32ビットの領域に格納される。

32bitかどうかは処理系依存と言うことを除けば、そうです。

⑧これらの基本解釈はその他の言語(PHP,Javsなど)に関しても適応される

「適用」と書きたかったのですかね。
言語によって大きく異なります。

このサイトでよく質問されている言語の中では、
Cでの文字、文字列の扱いは他の言語と大きく異なり、特殊と言って良いでしょう。

投稿2021/06/10 00:51

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuruyuru

2021/06/10 02:33

回答ありがとうございます。 曖昧だったところがはっきりしました。 C言語での文字、文字列の扱いは特殊なのですね現在PHPを学んでいて少し混乱していたのでそれを聞いて安心しました。PHPはPHPで基礎から学んでいこうと思います。
guest

0

⑥int buf="a";

これは、アドレスの代入となります
ワーニングは出ますが、とりあえず動きます
#キャストするとワーニングも出ません

char buf[]="a";
とすると、配列の初期化になりますね

んでもひとつ。
C言語では、文字型というのは存在しません
char というのは、あくまで1バイトの整数型です
'a' というのも、文字コードに直した整数です

投稿2021/06/09 22:22

編集2021/06/09 22:27
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuruyuru

2021/06/09 22:42

確かに実行できました。 printf関数で(“%c,%d”,buf)で出力したところ (?,よくわからない数値(アドレス?))が表示されました。 ⑦の補足ですね、ありがとうございます。この考えで問題なさそうです。
yuruyuru

2021/06/09 22:48

(“%c,%d”,buf)→ (“%c,%d”,buf,buf)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問