情報処理4レポート課題(9)の解答例

更新:2008年11月24日


  1. 符号なし整数を扱うunsigned int型をバイナリモードでファイルに書き込みした際に、 そのバイト列がどうなっているのかを確認します。
    1. 次の文章において、(a)から(h)までに適当な文言に置き換えて下さい。

      次のプログラムはsizeof演算子を用いてchar型の大きさを画面表示します。
      sizeof_char.c
      #include<stdio.h>
      
      int main(void){
      	printf("%d\n", sizeof(char));
      	return 0;
      }
      
      実行結果からchar型の大きさは(a)バイトであることが分かります。 このプログラムを改訂すればunsigned int型の大きさを調べることもでき、 使っている計算機でのunsigned int型は(b)バイトです。 bfile1.cを書き換えてunsigned int型を何かバイナリモードでファイルに書き込むと そのファイルの大きさは(c)バイトです。 unsigned int型で表すことのできる数値は0から4294967295までの(d)個です。 unsigned int型の大きさ(b)バイトは(e)ビットで、 unsigned int型が(f)の(g)乗個の数値を扱うことができることを意味します。 実際、(f)の(g)乗は(h)です。


      実行結果からchar型の大きさは1バイトであることが分かります。 このプログラムを改訂すればunsigned int型の大きさを調べることもでき、 使っている計算機でのunsigned int型は4バイトです。 bfile1.cを書き換えてunsigned int型を何かバイナリモードでファイルに書き込むと そのファイルの大きさは4バイトです。 unsigned int型で表すことのできる数値は0から4294967295までの4294967296個です。 unsigned int型の大きさ4バイトは32ビットで、 unsigned int型が2の32乗個の数値を扱うことができることを意味します。 実際、2の32乗は4294967296です。

    2. bfile1.cを次のように改訂して、符号なし整数を扱うunsigned int型をバイナリモードで書き込むようにし、下の表を埋めましょう。
      • aの型をunsigned intで宣言する。
      • aへの設定値の後ろにuを付ける (aに123を設定したい場合にはa=123u;とする)。
      設定値バイナリコード備考
      0u0000 0000 
      1u0100 0000 
      2u0200 0000 
      10u0a00 0000 
      16u0f00 0000 
      255uff00 0000 
      256u0001 0000 
      65536u0000 0100 
      16777215uffff ff00 
      16777216u0000 0001 
      4294967295uffff ffff 
      4294967296u0000 0000 コンパイル時に警告が出ますが無視して実行してみて下さい。
    3. unsigned int型をバイナリモードでファイルに書き込みした際に、 そのバイト列がどうなっているのかを説明して下さい(ヒント:エンディアン)。
      バイト毎逆順に格納されています。 エンディアンとは、複数バイトで構成されるデータをメモリに格納する方式です。 リトルエンディアンは、バイト毎逆順に格納します。 皆さんが使用している計算機はリトルエンディアンなので、 データ0x00000001は01 00 00 00のようにバイト毎逆順に格納されます。
  2. 符号付き整数を扱うint型をバイナリモードでファイルに書き込みした際に、 そのバイト列がどうなっているのかを確認します。
    1. 次の文章において、(a)から(h)までに適当な文言に置き換えて下さい。

      次のプログラムはsizeof演算子を用いてchar型の大きさを画面表示します。
      sizeof_char.c
      #include<stdio.h>
      
      int main(void){
      	printf("%d\n", sizeof(char));
      	return 0;
      }
      
      実行結果からchar型の大きさは(a)バイトであることが分かります。 このプログラムを改訂すればint型の大きさを調べることもでき、 使っている計算機でのint型は(b)バイトです。 bfile1.cを書き換えてint型を何かバイナリモードでファイルに書き込むと そのファイルの大きさは(c)バイトです。 int型で表すことのできる数値は -2147483648から2147483647までの(d)個です。 int型の大きさ(b)バイトは(e)ビットで、 int型が(f)の(g)乗個の数値を扱うことができることを意味します。 実際、(f)の(g)乗は(h)です。


      実行結果からchar型の大きさは1バイトであることが分かります。 このプログラムを改訂すればint型の大きさを調べることもでき、 使っている計算機でのint型は4バイトです。 bfile1.cを書き換えてint型を何かバイナリモードでファイルに書き込むと そのファイルの大きさは4バイトです。 int型で表すことのできる数値は -2147483648から2147483647までの4294967296個です。 int型の大きさ4バイトは32ビットで、 int型が2の32乗個の数値を扱うことができることを意味します。 実際、2の32乗は4294967296です。

    2. bfile1.cを次のように改訂して、符号付き整数を扱うint型をバイナリモードで書き込むようにし、下の表を埋めましょう。
      • aの型をintで宣言する。
      • aに123を設定したい場合にはa=123;とする。
      設定値バイナリコード備考
      00000 0000 
      10100 0000 
      20200 0000 
      100a00 0000 
      161000 0000 
      255ff00 0000 
      2560010 0000 
      655360000 0100 
      16777215ffff ff00 
      167772160000 0001 
      2147483647ffff ff7f 
      21474836480000 0080 コンパイル時にオプション「-std=c99」を付けて下さい。
      -1ffff ffff 
      -2ffff fffe 
      -3ffff fffd 
      -21474836462000 0080 
      -21474836471000 0080 
      -21474836480000 0080 コンパイル時にオプション「-std=c99」を付けて下さい。
      -2147483649ffff ff7f コンパイル時に警告が出ますが無視して実行して下さい。
    3. int型をバイナリモードでファイルに書き込みした際に、 そのバイト列がどうなっているのかを説明して下さい(ヒント:エンディアンと2の補数表現)。
      バイト毎逆順に、負数については2の補数表現が用いられている。 2の補数表現については例えば、 十進数1の(エンディアンを考慮しない)バイト列0x00000001のビット列00000000000000000000000000000001(0が31個)をビット反転させた 11111111111111111111111111111110(1が31個)に1足した 11111111111111111111111111111111(1が32個)が十進数-1になります。 2の補数について詳しくは「情報処理1」を復習して下さい。
C言語では整数を表すデータ型として、本レポート課題で扱ったunsigned int, intの他に、unsigned char, char, unsigned short, shortなどがあります。 unsignedがつくか否かで、非負数のみか負数も扱うかを示し、 後はchar:1バイト, short:2バイト, int:4バイト(皆さんが用いている計算機での話)のように大きさ(バイト数)が異なります。
以下は、皆さんの幾つかの考察・感想に対するコメントです。
unsigned int型は符号無しと言う事なので負の数のぶんまで整数に使えるint型と思えば 良いでしょうか?
良いです。
4294967296で0000 0000なのはその右の2桁に01が隠れているのかもしれないと思った。
いやいや,隠れてませんよ.
バイナリモードで書き込むと16進数で表示される。
いやいや,バイナリモードで書き込んだデータを16進数で表示しているのです.
エンディアンがなぜ2個区切りなのか分かりません。
2個区切りに見えるのは,16進数で1バイトを表現するのに2桁必要だからです.
1-2の問題の設定値で使われた"u"はunsignedのことだろうか?
その通り.
ビッグエンディアンの方がわかりやすい、なのになぜリトルを使うのかよくわからない
バイトをまたがった桁上がりを含む加算を行う際に, 下位バイトから処理していくならば処理対象の順に格納されていると云えます。
あの有名な某フリー百科事典によれば big endianのほうが人間にとって分かりやすいというが もはやコンピュータの都合に頭を合わせてしまっている自分にとっては little endianのほうがわかりやすい。 むしろbig endianのメリットは何だろう。 bigのほうがわかりやすいという人はいるのだろうか。
あくまでも経験上ですが, 初心者にはビッグエンディアンの方が分かりやすいようですよ. リトルエンディアンの方が分かりやすいと思う理由が 「もはやコンピュータの都合に頭を合わせてしまっている」ならば, とても良いことだと思います.
エンディアンってインディアンとかと似てて紛らわしい。 と思います・・・・・・
エンディアンの語源は「ガリバー旅行記」です.
-std=c99をつける意図が分からなかった。
皆さんが普段使っているgccは(概ね)規格C90にしたがっているのですが, 当該の処理をするには規格C99でコンパイルする必要があったからです. いつもオプション-std=c99をつけてもいいのですが, 普段は面倒なので省いています.
もともとはテキストファイルもバイナリファイルをテキストファイルとして評価したもの なのでしょうか・・・。
その通り.
バイナリファイルがどうして音楽データなどに適しているのかは分からない
テキストファイルは人間が読んだり書いたりしやすい形式のファイル, バイナリファイルは計算機が読んだり書いたりしやすい形式のファイル, という分け方もできて,音楽データなどリアルタイムに処理しなければならないものについては,バイナリファイルの方が処理遅延がなくて良いと思います.
このバイナリデータの見る方法というのがどの程度のもの(C言語で書かれているもの限 定?)を見ることができるのかが気になった。
世の中の全てのバイナリデータを同様に見ることができます.
私もプログラムを組むのは好きなのでプログラミングの課題がなくてさびしく思っていま す。 発展課題のような提出義務のないプログラムを組む課題を出すというのはどうでしょうか 。
うーん,ちょっと難しいですね. そのときの課題がプログラミングでない際に,その発展もまたプログラミングでない場合の方が多いと思います. かといって,全く関係のないプログラミング課題ならば,自主的にやられた方がいいかなと. 問題意識は持っているので,考えてはみますが,期待はしないで下さい..
せめemacsでもGNOM端末(?)のように打った文字を記憶できたらい いのに、、、
できてもおかしくはないと思いますが知らないので, 是非,調べて教えて下さい.
いざプログラムを書く時に今まで学んだ事が出てこない ことが多く、自分が嫌になりますが。
段々にです.
レポート受信状況のページの古い履歴はけしてもらえないでしょうか。 ちょっと目がしぱしぱします。
見にくくてすみませんが,次学期開始時までこのままです.
パソコン室の空気が悪すぎて集中力が祖がれます。
ええと,これはまんま空気のことでしょうか. ならば,いかんともしがたいので(多分,換気は禁止のはず), 定期的に外に出て体内の空気を入れ換えるとかどうでしょう. それとも空気=雰囲気のことでしょうか. たまに大声で雑談していたり,大音量で何か流している人がいるようですね. ならば,耳栓はいかがでしょう.
問題1-2はものすごく単純作業でした。 でもこういうの好きです。 B型だから。
(笑)
気づいたのは「(a)」などの空欄埋めは紙でやっているとそうでもないがPC上でやってい るとどれがどこに対応していたのかがわかりずらく混乱する事があった。紙でやっている とそんなことはないのでやはり紙は無くならないと自分は思います(問題がややこしいと いう批判ではないです)
そうですね。いつか、紙のように扱えるコンピュータが現れるといいのですが。
革ジャンを買ったのですが、着る時期がむずかしいです。
たしかに。今日は着てもよいと思います。
「朝から頭痛がひどくて授業に集中できなかった。」, 「今日朝おきたときに違和感を感じた。なんと喉がやられていた。」
お大事に。
寒くなってきて指が動かなくてキーボードを打つのが遅くなりました。。
指抜きの手袋はどうでしょう.
最近、朝がとても寒いです。ホッカイロを色々な場所に貼って試しているのですが、どこ に貼るのがベストですか?
体温が逃げやすいのは首の後ろだと聞いたことがあり, 冬のダイビング時にはいつも首後部の下にカイロを貼っています.
友達がポケットモンスターにまだ熱中しています。
熱中できるものがあるのは良いことです.
最近ドラクエ5をやりはじめました。結婚相手はフローラかビアンカかとても迷いました 。結局1時間迷ってビアンカにしました。
残念ながらドラクエは分からんです.○野先生ならば分かるのかな.
今晩の夕飯はカレーです。
うちは先週の金曜でした.タマリンド入れると旨いっすよ.
今日はとっても寒いです。 先生は朝起きれてますか??
カミさんに叩き起こされます.

何かありましたら、 まで。