独学で学んでいるため自分の理解が合っているのかを確認したく質問させていただきました。
間違っている解釈があればご指摘いただけると嬉しいです。
言語はC言語です。
①int型・・・4バイトのメモリ領域を確保
②char型・・・1バイトのメモリ領域を確保
③ASCII・・・文字コード
④ASCIIのコード表より
'a'=97
⑤97・・・コード
⑥int buf="a";
でエラーが起きるのはダブルクォーテーション(文字列リテラル)で文字列を表しそこには終端文字が付加されるため領域足りないから。
⑦int buf='a';
シングルクウォーテーションで文字コードを表すためbufには97を二進数に変換し32ビットの領域に格納される。
⑧これらの基本解釈はその他の言語(PHP,Javsなど)に関しても適応される
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア7703
0
ベストアンサー
①int型・・・4バイトのメモリ領域を確保
コンパイラによって異なります。
⑥int buf="a";
でエラーが起きるのはダブルクォーテーション(文字列リテラル)で文字列を表しそこには終端文字が付加されるため領域足りないから。
"a"
の型は(const) char[]
なので、型が異なります。メモリサイズがどうであれ、そのままの代入は成立しません。
⑧これらの基本解釈はその他の言語(PHP,Javsなど)に関しても適応される
されないものも多いです。たとえば、Javaでは文字列はすべてUTF-16として動きますし、PHPでは'a'
も"a"
も全く同じ、文字列の値となります。
投稿2021/06/09 22:26
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/09 23:44
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
総合スコア24670
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
総合スコア85901
0
⑥int buf="a";
これは、アドレスの代入となります
ワーニングは出ますが、とりあえず動きます
#キャストするとワーニングも出ません
char buf[]="a";
とすると、配列の初期化になりますね
んでもひとつ。
C言語では、文字型というのは存在しません
char というのは、あくまで1バイトの整数型です
'a' というのも、文字コードに直した整数です
投稿2021/06/09 22:22
編集2021/06/09 22:27総合スコア88042
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/10 00:47
2021/06/10 02:58
2021/06/10 04:21
2021/06/10 05:44