スライド7

Download Report

Transcript スライド7

プログラミング演習Ⅱ
第7回
データの基本型
情報・知能工学系
山本一公
[email protected]
課題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 宣言
– 整数定数
– 内部表現とビット、ビット単位の論理演算、シフト演算
• 浮動小数点型
– 浮動小数点定数
– “==”の危険性
• 演算子
基本型と数
算術型
列挙型 (enumeration type) (次回)
文字型
(character type)
char 型
signed char 型
unsigned char 型
整数型
(integer type)
short int 型
unsigned short 型
int 型
unsigned int 型
long int 型
unsigned long int 型
汎整数型
(integral type)
浮動小数点型
(floating type)
float 型
double 型
long double 型
基
本
型
整数型と文字型(1)
• 符号付き整数と符号無し整数
– signed 型指定子/unsigned 型指定子
– signed/unsigned を指定しなければ、signedになる
signed
unsigned
char
short int
int
long int
long long int
intは
書かなくてもよい
p.156, Table 7-1参照
最近の処理系
にはある
– 表わせる数の範囲は処理系に依存する ⇒ <limits.h>
– 「最低限」だけが言語仕様で決められている
• p.153, Column 7-1
整数型と文字型(2)
• 文字型
– char 型
– signedでもunsignedでもない
– コンピュータ内部ではsignedかunsignedのどち
らかで扱われている
• どちらになるかは処理系依存
• 文字の大小を比較する際に重要?
• ASCIIコードは7ビットしか使わないので、signed
でもunsignedでもどっちでも良かった(次回)
sizeof 演算子・typedef 宣言
• 変数が使っているバイト数を調べること
ができる
– “sizeof(型名)”として使う
• typedef 宣言
– 型に別の名前を与える
typedef
unsigned
size_t;
• 多くの処理系ではこうなっている
基数
• 人間が普段使っているのは、10進数
– 数字は0~9、10で桁上がり
• コンピュータが理解しやすいのは、2進数
– 0/1のみ。電圧の高低に対応する。
• 8進数
– 2進数を3桁毎にまとめたもの
– 数字は0~7、8で桁上がり
• 16進数
– 2進数を4桁毎にまとめたもの
– 数字は0~9+A~F、 (10進数の) 16で桁上がり
整数定数
• 10進定数
– 特別な書き方をしない今まで使ってきたもの
• 8進定数
– 先頭に”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 型
– float は単精度実数、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”
– “6.02E+23” ⇒ “6.02 × 1023”
• 省略形
– “.0” ⇒ “0.0”の意味
– “10.” ⇒ “10.0”と同じ意味
• ”10”と”10.0”は別の型(前者は整数型、後者は浮動
小数点型)になり、別の物なので注意
“==”の罠
• p.174, List 7-9もどき
int main(void)
{
float x;
for (x = 0.0; x != 10.0; x += 0.01) {
printf(“x = %f\n”, x);
}
return 0;
}
– このプログラムは停止しない!
• xがちょうど10.0になることがないから!
– 実数は誤差を伴っており、それが累積する!
演算子と型変換
• 演算子と優先順位
– p.177, Table 7-4
– 数学で使う演算子の優先順位は数学の通り
– それ以外の演算子に注意すること
• 型変換
– pp.178~179を読んでおくこと
– 基本的には「ある値を、それよりも表現できる値の
範囲が大きい型に変換するとき、値は保存される」、
「表現できる値の範囲が狭い型に変換するとき、値
は変化する」ということ
今週の課題(1)
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を改造すれば良い)。
2. 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
レポートについて
• 電子メールで提出
– 提出先は [email protected]
– Subjectを「プログラミング演習2 課題6提出
号・氏名 」とすること
– C言語ソースファイルを添付する
学籍番
• メールの本文には何も書かなくて良いです
– ソースファイルの頭にコメントで以下の情報を入れる
• 学籍番号・氏名
• プログラムの説明(どのように動くのか、工夫した点等)
• 実行結果(長い場合は一部)を貼る
– 提出締切は、11月21日(水) 12:00 (1週間後)
授業用Webサイト
• URL:
http://www.slp.cs.tut.ac.jp/~kyama/programming2/
– 課題のpdfファイルが置いてあります。
– 授業で使ったpptファイルを置いていきます。
• 質問メールは、以下のどちらかのアドレスまで
– [email protected][email protected]
• C-515へ直接質問しに来ても構いません