情報・知能工学系 山本一公 kyama@tut.jp プログラミング演習Ⅱ 第7回 データの基本型 情報・知能工学系 山本一公 kyama@tut.jp
課題4の採点結果から 課題4−2 2以上の数に対してのみ正しく判定できる 関数になっているものが多数 0や1、負の数が入力されても素数と判定されてしまう
前回の課題の解説・ポイント(1) 課題5-1 void intary_rcpy(int v1[], const int v2[], int no) { int i; for (i = 0; i < no; i++) { v1[i] = v2[no – i - 1]; /* 課題2-1(演習5-4)のような感じ */ /* 要素数が変数なので”-1”が必要 */ } return; /* void型なので返却値無し。この行は無くてもよい */
前回の課題の解説・ポイント(2) 課題5-2 ファイルスコープ変数か、staticを使う int a = -1; /* ファイルスコープ変数を使う例 */ int lcg_rand(void) { /* ファイルスコープ変数の代わりに、 ここで static int a = -1; としても良い */ if (a == -1) { a = W; } else { a = (X * a + Y) % (int)pow(2, Z); } return a;
今日の内容 教科書 pp.147~181 基本型と数 整数型と文字型 浮動小数点型 演算子 基本型、基数 sizeof 演算子、size_t 型、typedef 宣言 整数定数 内部表現とビット、ビット単位の論理演算、シフト演算 浮動小数点型 浮動小数点定数 “==”の危険性 演算子
基本型と数 算術型 汎整数型 (integral type) 列挙型 (enumeration type) (次回) 文字型 (character type) char 型 signed char 型 unsigned char 型 基本型 整数型 (integer type) short int 型 unsigned short 型 int 型 unsigned int 型 long int 型 unsigned long int 型 浮動小数点型 (floating type) float 型 double 型 long double 型
整数型と文字型(1) 符号付き整数と符号無し整数 signed 型指定子/unsigned 型指定子 signed/unsigned を指定しなければ、signedになる 表わせる数の範囲は処理系に依存する ⇒ <limits.h> 「最低限」だけが言語仕様で決められている p.153, Column 7-1 char short int int long int long long int intは 書かなくてもよい p.156, Table 7-1参照 signed unsigned 最近の処理系にはある
整数型と文字型(2) 文字型 char 型 signedでもunsignedでもない どちらになるかは処理系依存 文字の大小を比較する際に重要? ASCIIコードは7ビットしか使わないので、signedでもunsignedでもどっちでも良かった(次回)
sizeof 演算子・typedef 宣言 変数が使っているバイト数を調べることができる typedef 宣言 型に別の名前を与える 多くの処理系ではこうなっている typedef unsigned size_t;
基数 人間が普段使っているのは、10進数 コンピュータが理解しやすいのは、2進数 8進数 16進数 数字は0~9、10で桁上がり 0/1のみ。電圧の高低に対応する。 8進数 2進数を3桁毎にまとめたもの 数字は0~7、8で桁上がり 16進数 2進数を4桁毎にまとめたもの 数字は0~9+A~F、 (10進数の) 16で桁上がり
整数定数 10進定数 8進定数 16進定数 特別な書き方をしない今まで使ってきたもの 先頭に”0”(数字のゼロ)を付ける 012 … 8進数の12。10進数では10に相当。 16進定数 先頭に”0x”(数字のゼロと”x”)を付ける 0x12 … 16進数の12。10進数では18に相当。
整数定数の型 整数接尾語 u/U/l/L 定数が最終的に何型になるかのルール 数値の後ろに”u”か”U”を付けると符号無しになる 数値の後ろに”l”か”L”を付けると long になる 小文字だと分かりにくい(特に”l”。数字”1”と見間違う)ので、大文字を使いましょう! 定数が最終的に何型になるかのルール p.158の最後
内部表現 コンピュータの内部では全てがビット(0/1)の並びで表現されている 符号付き整数の内部表現 だいたいが「2の補数」表現 最上位ビットが符号ビット 16ビットの場合(p.161, Fig.7-10) -32768 -32767 … -3 -2 -1 0 +1 +2 +3 … +32766 +32767
ビット演算(1) ビット単位の論理演算子 論理演算子に似ているが、無関係なので注意すること! 論理積(AND) “&” 論理和(OR) “|” 排他的論理和(XOR) “^” 否定(NOT) “~” (ビット反転) 論理演算子に似ているが、無関係なので注意すること! 特に”&&”, ”||”との書き間違いに注意! コンパイル出来てしまうので
ビット演算(2) シフト演算 ビットフィールドを全体にシフト(移動)して、空いたビットを 0 か 1 で埋める 右シフトのときに、「論理シフト(0で埋める)」になるか「算術シフト(符号ビットで埋める)」になるかは処理系依存 左シフト “<<” (p.166, Fig.7-13) 右シフト “>>” (p.166, Fig.7-14) 視覚的には分かりやすい演算子 整数の掛け算の高速化……に昔は使っていた
浮動小数点型 float 型 / double 型 / long double 型 浮動小数点定数 long double は倍々精度実数 or 拡張倍精度実数 内部表現により精度が異なる 一般的には、p.172, Fig.7-16のような形 “IEEE 754 フォーマット”で調べると良い 浮動小数点定数 浮動小数点接尾語 f/F/l/L 何も付けないと、double型になる f/Fを付けると、float型になる l/Lを付けると、long double型になる
浮動小数点定数の続き “e/E”で10のべき乗を表現する 省略形 “80.0E-5” ⇒ “80.0 × 10-5” “.0” ⇒ “0.0”の意味 “10.” ⇒ “10.0”と同じ意味 ”10”と”10.0”は別の型(前者は整数型、後者は浮動小数点型)になり、別の物なので注意
“==”の罠 p.174, List 7-9もどき このプログラムは停止しない! 実数は誤差を伴っており、それが累積する! xがちょうど10.0になることがないから! 実数は誤差を伴っており、それが累積する! int main(void) { float x; for (x = 0.0; x != 10.0; x += 0.01) { printf(“x = %f\n”, x); } return 0;
演算子と型変換 演算子と優先順位 型変換 p.177, Table 7-4 数学で使う演算子の優先順位は数学の通り それ以外の演算子に注意すること 型変換 pp.178~179を読んでおくこと 基本的には「ある値を、それよりも表現できる値の範囲が大きい型に変換するとき、値は保存される」、「表現できる値の範囲が狭い型に変換するとき、値は変化する」ということ
今週の課題(1) 今使用している処理系で、char, signed char, unsigned char, signed short int, unsigned short int, signed int, unsigned int, signed long int, unsigned long int, signed long long int, unsigned long long int, float, double, long doubleがそれぞれコンピュータの内部で何バイトで表現されているかを表示するプログラムを作成せよ(プログラムそのものはあまり重要ではなく、結果を見ることが重要。List 7-4を改造すれば良い)。 p.169, 演習7-2のプログラムを作成せよ。main関数等も作成して、完成したプログラムを作成すること(main関数はList 7-7をベースに作ると良い)。
今週の課題(2) 課題6-2の考え方 全体が8ビットの場合で、3ビット右に回転 1 1 0 0 0 1 0 1 3ビット右にシフト 5ビット左にシフト 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0
レポートについて 電子メールで提出 提出先は prog2@slp.cs.tut.ac.jp Subjectを「プログラミング演習2 課題6提出 学籍番号・氏名 」とすること C言語ソースファイルを添付する メールの本文には何も書かなくて良いです ソースファイルの頭にコメントで以下の情報を入れる 学籍番号・氏名 プログラムの説明(どのように動くのか、工夫した点等) 実行結果(長い場合は一部)を貼る 提出締切は、11月21日(水) 12:00 (1週間後)
授業用Webサイト URL: http://www.slp.cs.tut.ac.jp/~kyama/programming2/ 課題のpdfファイルが置いてあります。 授業で使ったpptファイルを置いていきます。 質問メールは、以下のどちらかのアドレスまで kyama@tut.jp prog2@slp.cs.tut.ac.jp C-515へ直接質問しに来ても構いません