C言語入門

1
C言語入門
第2週
プログラミング言語Ⅰ(実習を含む。),
計算機言語Ⅰ・計算機言語演習Ⅰ,
情報処理言語Ⅰ(実習を含む。)
2
explorer の使い方
先週の復習1
3
explorer.exe
• ファイルの操作を行うソフト
• デスクトップもエクスプローラーの一部
デスクトップも「explorer」
これが「explorer」
コントロールパネルも
「explorer」
ここに「explorer」と入力し
ENTERキーを叩いても
explorer が表示できます
4
ポップアップ(popup)メニューの表示
• 表示させたい場所でマウス右クリック
• 例えばデスクトップの何もない場所で
• メニューの右にある三角印
• サブメニューが出る
ポップアップメニュー
サブメニュー
5
ファイルの作成とオープン
• explorer の
• 作成したい場所で
マウス右クリック
• ポップアップメニューが出る
• 新規作成→テキストドキュメント
• 出来たファイルは
適当に名前を付けても良い
• マウス左ダブルクリック
→メモ帳で開かれる
6
フォルダの作成
• 作成したい所で右クリック
• ポップアップメニューで
• →新規作成
• →フォルダ
• 「新しいフォルダ」ができた
7
フォルダを開く
• フォルダアイコンの上で左ダブルクリック
• explorer が開く
開いているフォルダ名
8
ファイルの移動
• 「テキストドキュメント」を
• 「新しいフォルダ」の中に移動
• 「ドラッグ&ドロップ」すれば良い
ドラッグ&ドロップ
移動しました
9
ファイルのコピー
• Ctrl を押したまま 「ドラッグ&ドロップ」
コピーができました
10
ファイルの選択
•
•
•
•
ファイルを単純にクリック
ファイル左側のチェックボックスをクリック
CTRL キーを押したままクリック(複数選択)
ファイルを囲むようにドラッグ(複数選択)
選択された
11
ファイルの削除
• 選択したファイル上で右クリック
• →削除
• ファイルを選択して「Delete」キーでも良い
ファイルが消えた
12
CUI作業環境 (端末: terminal)
• フォルダをSHIFT+右クリック
コマンドプロンプト
mintty + bash
右クリックしたフォルダを作業ディレクトリにして
端末(コマンドプロンプトやmintty)が開かれる
13
cmd と bash の主なコマンド
cmd
bash
マニュアルの表示
help [コマンド名]
man [コマンド名]
ファイル一覧
dir
ls
メッセージの表示
echo メッセージ
echo メッセージ
ファイルの内容を表示
type ファイル名
cat [ファイル名]
作業ディレクトリの移動
cd ディレクトリ名
cd [ディレクトリ名]
作業ディレクトリの表示
cd
pwd
ファイルコピー
copy コピー元 コピー先
cp コピー元 コピー先
ファイル移動
move コピー元 コピー先
mv コピー元 コピー先
ファイル削除
del ファイル名
rm ファイル名
ディレクトリの作成
mkdir ディレクトリ名
mkdir ディレクトリ名
ディレクトリの削除
rmdir ディレクトリ名
rmdir ディレクトリ目
14
cmd と bash の主なキー操作コマンド
cmd
動作
bash
Home
Ctrl
+
A
END
Ctrl
+
E
Ctrl
+
K
Shift
+
End
tab |←
→|
↑
行頭へ移動
行末へ移動
行末まで削除
ファイル名の補完
↓
コマンド履歴の再利用
15
教科書 pp.30-31.
ファイルの場所の記述方法(パス)
• 以下の図のフォルダ構成を仮定する
C:
Users
kou
Desktop
CLangI
week01
hello.c
作業フォルダは CLangI
CLangII
week01
hellogui.c
16
作業フォルダ
• カレントディレクトリ(current directory)とも言う
コマンドプロンプト
mintty + bash
ここに表示されているのが
作業フォルダ
教科書 pp.30-31.
Windows の絶対パス、相対パス
• フォルダの階層を \ で区切る
• 現在の作業フォルダは以下の場所
• C:\Users\kou\Desktop\CLangI
• 絶対パスはルートデバイスを基準に
• C:\Users\kou\Desktop\CLangI\week01\hello.c
• C:\Users\kou\Desktop\CLangII\week01\hellogui.c
• 相対パスは現在の作業フォルダを基準に
• week01\hello.c
• ..\CLangII\week01\hellogui.c
17
18
Cygwin の絶対パス、相対パス
• ディレクトリの階層を / で区切る
• 現在の作業ディレクトリは以下の場所
• /cygdrive/c/Users/kou/Desktop/CLangI
• 絶対パスはルートディレクトリ / を基準に
• /cygdrive/c/Users/kou/Desktop/CLangI/week01/hello.c
• /cygdrive/c/Users/kou/Desktop/CLangII/week01/hellogui.c
• 相対パスは現在の作業ディレクトリを基準に
• week01/hello.c
• ../CLangII/week01/hellogui.c
19
特別なフォルダ名
• 「..」
• 1つ親のディレクトリを意味する
• 「.」
• 現在のディレクトリを意味する
• UNIX では実行ファイルの検索パスに作業ディレ
クトリが含まれない
• 作業ディレクトリ内にある実行ファイルを実行する
際 ./ を実行ファイル名の前に付ける必要がある
20
補足
• フォルダとディレクトリは同じ概念
• Windows 流ではフォルダと呼ぶ
• UNIX 流ではディレクトリと呼ぶ
• /cygdrive は cygwin 特有の仮想ディレクトリ
• Windows のドライブが配置されている
• 通常 UNIX ではパスに : (コロン)を使わないため
• ネットワークドライブもアクセス出来る
• UNC 表記を用いる
• \\fs.cc.yamaguchi-u.ac.jp\YUアカウント名
• //fs.cc.yamaguchi-u.ac.jp/YUアカウント名
21
コマンドの検索パス
• 環境変数 PATH に設定されたパスからコマン
ドを探して実行する
• cmd での確認方法
> echo %PATH%
• 複数のパスは ; (セミコロン)で区切って与える
• bash での確認方法
$ echo $PATH
• 複数のパスは : (コロン)で区切って与える
教科書 p.27.
22
ファイル拡張子の表示
Windows 8 以降
• explorer.exe から
「表示」→「ファイル名拡張子」→ON
ファイル名末尾に
.○○○と表示される
教科書 p.27.
23
ファイル拡張子の表示
Windows 7 以前
• explorer.exe から
• 「Alt」→「ツール」→「オプション」→「表示」
→「登録されている拡張子は表示しない」→OFF
Alt叩くとメニュー出る
ファイル名末尾に
.○○○と出る
24
ファイル拡張子とは?
• ファイルの種類を表している
• アプリケーションとの関連付けに用いられる
•
•
•
•
•
•
•
実行ファイルは .exe や .com
テキスト文書は .txt
Word2007以降は .docx それより前は .doc
Excel2007以降は .xlsx それより前は .xls
PowerPoint2007以降は .pptx それより前は .ppt
圧縮ファイルは .zip .lzh .tgz .cab 等々
等々
• 変更すると開けなくなる
• 普通は変更する必要はない
• メール等で添付されて来たファイルには注意
• 文書ファイルに見えて実行ファイル(実はウィルス)ということも
25
教科書 pp.36-42.
C コンパイラによるコンパイル
• cmd.exe から bcc32 で行った例
コマンドプロンプト + Borland C++
C:\Users\kou\Desktop\CLangI2014>dir /B
hello.c
ファイル一覧の表示
C:\Users\kou\Desktop\CLangI2014>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
警告 W8070 hello.c 6: 関数は値を返すべき(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
コンパイル
C:\Users\kou\Desktop\CLangI2014>dir /B
hello.c
hello.exe
hello.obj
hello.tds
ファイル一覧の表示
C:\Users\kou\Desktop\CLangI2014>hello
hello, world
作成した実行ファイルを実行
26
教科書 p.17.
C コンパイラは何をしているのか?
• デバッグ情報付きコンパイルし逆アセンブル
• .rdata セクション部分
mintty + bash
$ gcc -g hello.c
$ objdump -d -S -s a.exe
a.exe:
ファイル形式 pei-x86-64
...
セクション .rdata の内容:
100403000 63796767 636a2d31
100403010 765f5265 67697374
100403020 73000000 00000000
100403030 68656c6c 6f2c2077
100403040 4743433a 2028474e
...
342e646c
6572436c
00000000
6f726c64
55292034
6c005f4a
61737365
00000000
00000000
2e382e31
cyggcj-14.dll._J
v_RegisterClasse
s...............
hello, world....
GCC: (GNU) 4.8.1
セクション .text の逆アセンブル:
文字データの16進表現
...
00000001004010d0 <main>:
#include <stdio.h>
文字データの配置アドレス
埋め込まれた文字データ
27
C コンパイラは何をしているのか?
• .text セクション部分
セクション .text の逆アセンブル:
...
00000001004010d0 <main>:
#include <stdio.h>
main()
{
1004010d0:
55
1004010d1:
48
1004010d4:
48
1004010d8:
e8
printf("hello,
1004010dd:
48
1004010e4:
e8
}
1004010e9:
48
1004010ed:
5d
1004010ee:
c3
1004010ef:
90
アセンブラコードを
アセンブルして得られた
マシン語のバイトコード
89 e5
83 ec 20
73 00 00 00
world\n");
8d 0d 4c 1f 00 00
77 00 00 00
83 c4 20
C言語を
コンパイルして得られた
アセンブラコード
push
mov
sub
callq
%rbp
%rsp,%rbp
$0x20,%rsp
100401150 <__main>
lea
callq
0x1f4c(%rip),%rcx
100401160 <puts>
add
pop
retq
nop
$0x20,%rsp
%rbp
サブルーチン(printf)の
呼び出し
# 100403030 <.rdata>
...
配置アドレス
元々の
C言語のコード
文字データ"hello, world\n"の
配置アドレス(前項参照)
28
C言語入門(変数と定数)
29
基礎知識
30
テキスト編集系ソフトの種類
• テキストエディタ (メモ帳, 秀丸, etc,,,)
• 基本的にプレーンな文字情報のみ、装飾なし
• リッチテキストエディタ (ワードパッド, etc,,,)
• 字体、色、サイズ等の装飾が可能に
• ワードプロセッサ (Word, 一太郎, etc,,,)
• 更に高度な、文書作成支援機能
• DTPツール (InDesign, Publisher, etc,,,)
• 印刷用の版下作成、特に割付へ特化
31
プログラミング向け
テキストエディタの機能
•
•
•
•
•
•
•
•
構文解析機能
シンタックスハイライト機能
行番号表示機能
入力補完機能
マクロ機能
正規表現対応の検索機能
タグジャンプ機能
等々
32
テキストエディタ
• 窓の杜
• オフィス / 文書作成 / テキストエディター
•
http://www.forest.impress.co.jp/library/nav/genre/offc/document_txteditor.html
• 学習・プログラミング / プログラミング / プログラム向けエディター
•
http://www.forest.impress.co.jp/library/nav/genre/stdy/program_progeditor.html
• Vector
• Windows / 文書作成 / テキストエディタ
•
http://www.vector.co.jp/vpack/filearea/win/writing/edit/
33
テキストエディタ
• サクラエディタ
• http://sakura-editor.sourceforge.net/
• xyzzy
• http://xyzzy-022.github.io/
34
統合開発環境
• Microsoft Visual Studio
• http://www.visualstudio.com/ja-jp/
• Eclipse
• Pleiades - Eclipse プラグイン日本語化プラグイン
• http://mergedoc.sourceforge.jp/
• NetBeans
• https://ja.netbeans.org/
35
教科書 p.46.
コメント
•
•
•
•
プログラムとしては解釈されない
後で読む人用に注釈をしておく機能
/* ~ */ の間がコメント
// から行末までがコメント
comment_test.c
1
2
3
4
5
6
7
8
9
#include <stdio.h>
緑の部分がコメントとして
扱われる
main()
{
/*
ここがコメント
*/
printf("hello, world\n"); // ここもコメント
}
36
教科書 pp.61, 64-66, 98.
printf 関数の初歩
• 括弧の中にカンマ「,」で区切って複数の引数
(パラメータ)を与える。
• 1つ目の引数は書式
• 書式内の %d %f %s 等の箇所には2つ目以降の
引数が順に埋め込まれる
printf("1 + 2 = %d\n", 1 + 2);
1 + 2 =
\n
ここには int 型の整数型データとして解釈した
2つ目の引数の値(上記の例では1+2の計算結果)が
符号付き10進数にして印字される
\n は改行として機能する
%d は整数、
%f は実数、
%s は文字列の埋め込み用
37
演習: 値を表示してみよう(1/2)
• printf の1つ目の引数に "%d\n", "%f\n",
"%s\n" を与え、2つ目の引数に、整数、実数、
文字列を与えて、それぞれの組み合わせで、
どうなるか試してみよう。
1
2
3
4
5
6
printf_practice_11.c
mintty + bash + gcc
#include <stdio.h>
$ gcc printf_practice_11.c && ./a
123
void main()
{
printf("%d\n", 123);
}
5行目を書き変えて
計9つのファイルを作りましょう。
コマンドプロンプト + Borland C++
>bcc32 printf_practice_11.c && printf_practice_11
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, ...
printf_practive_11.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, ...
123
38
演習: 値を表示してみよう(2/2)
• 結果を調べて表にまとめてみよう。
• ファイル名は整理番号を用いて
printf_practice_XY.c のように付けてください。
• 例えば※2の欄は printf_practice_32.c となります。
整理番号Y
1
2
3
整理番号X
第1引数\第2引数
123
123.456
"123.456"
1
"%d\n"
123と表示
2
"%f\n"
3
"%s\n"
※2
39
SI接頭辞
名前
キロ(kilo)
メガ(mega)
ギガ(giga)
テラ(tera)
ペタ(peta)
エクサ(exa)
ゼタ(zetta)
ヨタ(yotta)
記号
K
M
G
T
P
E
Z
Y
乗数
10001 =103
10002=106
10003=109
10004=1012
10005=1015
10006=1018
10007=1021
10008=1024
40
2進接頭辞(IEC/IEEE)
名前
キビ(kibi)
メビ(mebi)
ギビ(gibi)
テビ(tebi)
ペビ(pebi)
エクスビ(exbi)
ゼビ(zebi)
ヨビ(yobi)
記号
Ki
Mi
Gi
Ti
Pi
Ei
Zi
Yi
乗数
10241=210
10242=220
10243=230
10244=240
10245=250
10246=260
10247=270
10248=280
41
教科書 pp.50-55.
bit と byte
1bit
• b – bit
• 2進数 1 桁
• 通信速度や IC の容量表記等
• 例:
• 100Mbps (100 Mega bits per seconds)
• B – Byte
• 8bit (半角英数1文字分に相当)
• 記憶メディアの容量表記等
• 例:
• 32GB (32 Giga Bytes)
0
1
1bitの記憶素子には
2進数の1桁つまり
0 または 1 のみ
記憶できる
1bit毎では
単位が小さ過ぎて使い辛い
通常は
8桁を1まとめにして扱う
8bit = 1byte
00011011
8bit = 1byte は 28 = 256 通りの整数を表現可能
符号なし: 0~255
符号あり: −128~127
42
教科書 pp.50-55.
16進数
2進数
10進数
16進数
2進数
10進数
16進数
0b0000
0
0x0
0b1000
8
0x8
0b0001
1
0x1
0b1001
9
0x9
0b0010
2
0x2
0b1010
10
0xa
0b0011
3
0x3
0b1011
11
0xb
0b0100
4
0x4
0b1100
12
0xc
0b0101
5
0x5
0b1101
13
0xd
0b0110
6
0x6
0b1110
14
0xe
0b0111
7
0x7
0b1111
15
0xf
2進数 4桁 → 16進数 1桁 に対応
2進数から変換するとキリが良い
バイト単位のデータを表す際、読み易い
例: 0b0001001000110100
= 4660 = 0x1234
2進数 4桁
2進数 8桁
2進数16桁
2進数32桁
2進数64桁
→
→
→
→
→
16進数 1桁
16進数 2桁
16進数 4桁
16進数 8桁
16進数16桁
43
教科書 pp.50-55.
8 bit 整数の N 進数の表現
2進数
符号なし10進数
符号あり10進数
16進数
0b00000000
0
0
0x00
0b00000001
1
1
0x01
0b00000010
2
2
0x02
0b00000011
3
3
0x03
:
:
:
:
0b01111111
127
127
0x7f
0b10000000
128
-128
0x80
:
:
:
:
0b11111100
252
-4
0xfc
0b11111101
253
-3
0xfd
0b11111110
254
-2
0xfe
0b11111111
255
-1
0xff
符号ありは
ここで
正負が
入れ替わる
符号あり整数の場合は最上位ビットを符号ビットとして扱う(2の補数表現)
44
教科書 pp.50-55.
16 bit 整数の N 進数の表現
2進数
符号なし10進数
符号あり10進数
16進数
0b0000000000000000
0
0
0x0000
0b0000000000000001
1
1
0x0001
0b0000000000000010
2
2
0x0002
0b0000000000000011
3
3
0x0003
:
:
:
:
0b0111111111111111
32767
32767
0x7fff
0b1000000000000000
32768
-32768
0x8000
:
:
:
:
0b1111111111111100
65532
-4
0xfffc
0b1111111111111101
65533
-3
0xfffd
0b1111111111111110
65534
-2
0xfffe
0b1111111111111111
65535
-1
0xffff
符号ありは
ここで
正負が
入れ替わる
符号あり整数の場合は最上位ビットを符号ビットとして扱う(2の補数表現)
45
N bit 整数の最大値・最小値
Bit数
符号あり10進数最小値
符号あり10進数最大値
符号なし10進数最大値
8
-128
127
255
16
-32,768
32,767
65,535
32
-2,147,483,648
2,147,483,647
4,294,967,295
64
-9,223,372,036,854,775,808
9,223,372,036,854,775,807
18,446,744,073,709,551,615
𝑁
−2𝑁−1
2𝑁−1 − 1
2𝑁 − 1
参考: 128bit の場合
Bit数
128
符号あり10進数最小値
170,141,183,460,469,231,731,687,303,715,884,105,727
符号あり10進数最大値
-170,141,183,460,469,231,731,687,303,715,884,105,728
符号なし10進数最大値
340,282,366,920,938,463,463,374,607,431,768,211,456
46
符号なし8bit整数の演算
• 整数オーバーフロー
11111111 = 255
+)00000001 =
1
100000000 =
0
有効桁の外に1が溢れた
• 整数アンダーフロー
100000000 =
0
-)00000001 =
1
11111111 = 255
有効桁外の外から1が溢れた
47
符号あり8bit整数の演算
• 整数オーバーフロー
01111111 = 127
+)00000001 =
1
10000000 = -128
符号ビットに1が溢れた
• 整数アンダーフロー
10000000 = -128
-)00000001 =
1
01111111 = 127
符号ビットから1が溢れた
• 2の補数表現
有効桁の外から1を借りてくる
100000000 = 0
-)00000001 = 1
11111111 = -1
11111111 = -1
+)00000001 = 1
100000000 = 0
有効桁の外に1を捨てる
48
RAM (Random Access Memory)
• コンピュータのメインメモリで利用されている
49
教科書 pp.52-56.
メモリの構成
• 1byte単位でアドレスが振られている
• つまり各アドレスには1byteの値を格納出来る
32bitのOSは32bitのアドレス空間
最大232 Bytes=4GiB
64bitのOSは64bitのアドレス空間
最大264 Bytes=16EiB
0x00000000
0x00
0x0000000000000000
0x00
0x00000001
0x00
0x0000000000000001
0x00
0x00000002
0x00
0x0000000000000002
0x00
0x00000003
0x00
0x0000000000000003
0x00
:
:
:
:
0xffffffff
0x00
アドレス
格納値
:
:
0xffffffffffffffff
アドレス
:
:
0x00
格納値
50
大きい値の扱い方
• 複数のアドレスをまとめて変数に割り当てる
:
:
:
:
:
:
0x~00
0x00
0x~01
:
:
0x~00
0x00
0x00
0x~01
0x00
0x~02
0x00
0x~02
0x00
0x~03
0x00
0x~03
0x00
0x~04
0x00
0x~04
0x00
0x~05
0x00
0x~05
0x00
0x~06
0x00
0x~06
0x00
0x~07
0x00
0x~07
0x00
0x~08
0x00
0x~08
0x00
:
:
:
:
8bit
:
:
:
:
16bit
51
大きい値の扱い方
• 複数のアドレスをまとめて変数に割り当てる
:
:
:
:
:
:
:
:
0x~00
0x00
0x~00
0x00
0x~01
0x00
0x~01
0x00
0x~02
0x00
0x~02
0x00
0x~03
0x00
0x~03
0x00
0x~04
0x00
0x~04
0x00
0x~05
0x00
0x~05
0x00
0x~06
0x00
0x~06
0x00
0x~07
0x00
0x~07
0x00
0x~08
0x00
0x~08
0x00
:
:
:
:
32bit
:
:
:
:
64bit
52
教科書 pp.59-61.
変数の宣言、値の代入
• 変数は値を格納する箱のようなもの
int a; // (1) 変数の宣言
a = 10; // (2) 値の代入
// (3)
(1)
10
(2)
(3)
?
?
10
a
a
a
int 型の変数を作り
a という名前を付ける
この時点では
中身は未定
変数 a に
10 を代入する
変数 a に 10 が
代入された状態に
なっている
53
教科書 pp.59-61.
変数の宣言と初期化
• 宣言と同時に初期化することも出来る
int a = 10; // (1) 変数の宣言と初期化
(1)
10
a
int 型の変数を作り
a という名前を付け
10 を代入する
54
変数への値の代入
• 変数への代入は「=」を用います。C言語にお
いて「=」は「イコール」や「等号」ではなく、「代
入」を意味する記号です。
• 代入は、右辺の計算結果を左辺の変数に格
納します。(左辺には必ず単独の変数を書く)
a = 10;
// (1) 値の代入
a = a + 1; // (2) 計算結果の代入
(2)
10
a
10
計算結果で左辺を
上書きする
a
+
1
まず右辺を
計算して
55
教科書 pp.59-61.
変数
• 文法
データ型
データ型
データ型
データ型
変数名;
// 変数の宣言
変数名=初期代入値; // 変数の宣言と初期化
変数名1, 変数名2; // 複数の変数の宣言
変数名1=初期代入値1, 変数名2=初期代入値2;
// 複数の変数の宣言と初期化
変数名 = 値;
// 値の代入
56
教科書 p.54.
リテラル
• ソースコードに直接記述された値
• 数値、文字列等
wavetest.c
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
int main(int argc, char *argv[])
{
if (argc < 4) {
printf("Usage: %s output_file micro_sec MIDI_note_No\n\n", argv[0]);
return EXIT_FAILURE;
}
FILE *fp;
if (fp = fopen(argv[1], "wb")) {
fwrite_wav(44100, atoi(argv[2]), atoi(argv[3]), fp);
fclose(fp);
}
return EXIT_SUCCESS;
}
赤字で示したような部分が
リテラルに当たる
57
教科書 pp.53-55., [1] pp.44-45.
整数のデータ型
• signed char, unsigned char
• 1バイト、局所的な文字セット内に1文字を保持し得る
• signed short, unsigned short
• 少なくとも16ビット
• signed int, unsigned int
• 少なくとも16ビット
• 通常ホスト計算機の自然な整数サイズ
• 現在は 32 or 64 ビットであることが多い
• signed long, unsigned long
•
コンパイルする環境により
使える値の最大値・最小値が
異なる!
• 少なくとも32ビット
明確にビット数は定められていない
• 割り当てビット数の大小関係は short <= int <=long
• 型の前に signed を付けると符号ありの型になる
• 通常 signed は省略する(書かない)
• 型の前に unsigned を付けると符号なしの型になる
58
教科書 pp.53-55., [1] pp.44-45.
整数のデータ型
サイズ
符号あり
符号なし
備考
1バイト
signed char
unsigned char
主に文字、文字列、バイナリデータ用
16bit以上
signed short
unsigned short
16bit以上
signed int
unsigned int
32bit以上
signed long
unsigned long
通常はこれを使う
59
整定数のリテラル
• 何も指定しないと int 型
• 末尾に接尾子(U, L)を付けると型指定される
int
long
unsigned int
unsigned long
i
l
ui
ul
=
=
=
=
1234;
1234L;
1234U;
1234UL;
//
//
//
//
int 型
long 型
unsigned int 型
unsigned long 型
60
教科書 p.54.
C言語のN進数リテラル
•
•
•
•
0b~
2進数リテラル(C++14の仕様*1)
0~
8進数リテラル
2015-04-25追加
0x~
16進数リテラル
*1: 少なくとも gcc4.3, Clang3.2 では実装済み
• 古いコンパイラでは2進数リテラルは使えない
• 例えばBorland C++ で 0b~ は使えない
int
int
int
int
dec
bin
oct
hex
=
=
=
=
100;
0b100;
0100;
0x100;
// 10進数の100
// 2進数の100=10進数の 4
// 8進数の100=10進数の 64
// 16進数の100=10進数の256
61
演習: 値を表示してみよう(1/2)
• printf の1つ目の引数に "%d\n" を与え、2つ
目の引数に、前のページの dec, bin, oct, hex
を与えてみよう。
• ファイルは dec, bin, oct, hex の4つ作る。
1
2
3
4
5
6
7
printf_practice_hex.c
mintty + bash + gcc
#include <stdio.h>
$ gcc printf_practice_hex.c && ./a
256
void main()
{
int hex = 0x100;
printf("%d\n", hex);
}
5,6行目を書き変えて
計4つのファイルを作りましょう。
コマンドプロンプト + Borland C++
>bcc32 printf_practice_hex.c && printf_practice_hex
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, ...
printf_practive_11.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, ...
256
62
教科書 pp.55-56.
浮動小数点数のデータ型
• float
• double
• long double
単精度浮動小数点数
倍精度浮動小数点数
拡張精度の浮動小数点数
63
教科書 pp.55-56.
浮動小数点数とは
• IEEE754
• http://ja.wikipedia.org/wiki/IEEE_754
• 以下のようなに表現する方法
±仮数部 × 2指数部
ビット数
符号
指数部
仮数部
単精度
32bit
1bit
8bit
23bit
倍精度
64bit
1bit
11bit
53bit
四倍精度
128bit
1bit
15bit
112bit
指数部の値で
小数点の位置が移動するので
浮動小数点と呼ばれる
64
浮動小数点数定数のリテラル
• 何も指定しないと double 型
• 末尾に接尾子(F, L)を付けると型指定される
• 1.234E5 のような書き方も出来る(指数表現)
• これは1.234 × 105 を意味する
float
f = 1234F;
double
d = 1234;
long double ld = 1234L;
double
e
// float 型
// double 型
// long double 型
= 1.234E5; // double 型の 123400
備考
65
2015-04-25追加
固定小数点数
• 10進数8桁を4桁ずつに分けた例
103 102 101 100
1
2
3
4
. 10−1 10−2 10−3 10−4 の桁
.
5
6
7
8
0000.0000~9999.9999 まで表現可能
• 2進数も8桁も同様に4桁ずつに分けてみる
23
22
21
20
.
0
0
0
1
.
2−1 2−2 2−3 2−4 の桁
1
0
1
1
0b0000.0000~0b1111.1111 まで表現可能
備考
66
2015-04-25追加
指数表示(浮動小数点数)
• 10進数8桁を4桁ずつに分けた例
103 102 101 100
1
2
3
4
103 102 101 100 の桁
×10^
1
2
3
4
0000×10^0000~9999×10^9999 まで表現可能
• 2進数も8桁も同様に4桁ずつに分けてみる
23
22
21
20
0
0
0
1
×2^
23
22
21
20
0
0
0
1
の桁
0b0000×2^0b0000~0b1111×2^0b1111 まで表現可能
67
教科書 p.51.
ASCII文字コード表
上
位
4
ビ
ッ
ト
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
下位4ビット
0 1 2
NUL SOH STX
DLE DC1 DC2
SP ! "
0 1 2
@ A B
P Q R
` a b
p q r
3
ETX
DC3
#
3
C
S
c
s
4
EOT
DC4
$
4
D
T
d
t
5
ENQ
NAK
%
5
E
U
e
u
6
ACK
SYN
&
6
F
V
f
v
7
BEL
ETB
'
7
G
W
g
w
8
BS
CAN
(
8
H
X
h
x
9 A B C D E F
HT LF VT FF CR SO SI
EM SUB ESC → ← ↑ ↓
) * + , - . /
9 : ; < = > ?
I J K L M N O
Y Z [ \ ] ^ _
i j k l m n o
y z { | } ~ DEL
http://ja.wikipedia.org/wiki/ASCII
赤字は制御コード
教科書 p.51.
68
制御コード
HEX
Abbr
ctrl
eseq
Name
Hex
Abbr
ctrl
eseq
0x00
NUL
^@
\0
Null
0x10
DLE
^P
Data Link Escape
0x01
SOH
^A
Start of Heading
0x11
DC1
^Q
Device Control 1
0x02
STX
^B
Start of Text
0x12
DC2
^R
Device Control 2
0x03
ETX
^C
End of Text
0x13
DC3
^S
Device Control 3
0x04
EOT
^D
End of Transmission
0x14
DC4
^T
Device Control 4
0x05
ENQ
^E
Enquiry
0x15
NAK
^U
Negative Acknowledgement
0x06
ACK
^F
Acknowledgement
0x16
SYN
^V
Synchronous idle
0x07
BEL
^G
\a
Bell
0x17
ETB
^W
End of Transmission Block
0x08
BS
^H
\b
Back Space
0x18
CAN
^X
Cancel
0x09
HT
^I
\t
Horizontal Tab
0x19
EM
^Y
End of Medium
0x0a
LF
^J
\n
Line Feed
0x1a
SUB
^Z
Substitute
0x0b
VT
^K
\v
Vertical Tab
0x1b
ESC
^[
0x0c
FF
^L
\f
Form Feed
0x1c
FS
^\
File Separator
0x0d
CR
^M
\r
Carriage Return
0x1d
GS
^]
Group Separator
0x0e
SO
^N
Shift Out
0x1e
RS
^^
Record Separator
0x0f
SI
^O
Shift In
0x1f
US
^_
Unit Separator
0x20
SP
Space
0x7f
DEL
^?
Delete
\e
Name
Escape
69
教科書 p.56.
文字定数のリテラル
• 1文字を単一の引用符(')で囲む
• char型の値になる
単一の引用符(')は
↑Shift
char
char
char
char
a
lf
vt
cr
=
=
=
=
'a';
'\012';
'\x0b';
'\r';
+
'
7
//「a」の文字コード0x61
//改行の文字コード0x0aを8進数で
//垂直タブの文字コード0x0bを16進数で
//復帰の文字コード0x0dを
//エスケープシーケ1ンスで
2015-04-25追加
演習: 値を表示してみよう3(1/2)
• printf_practice_hex.c を元にして以下の点を
変更して動作を確認せよ。
• ファイル名をコピーして以下の4ファイルを通
る。
•
•
•
•
printf_practice_a.c
printf_practice_lf.c
printf_practice_vt.c
printf_practice_cr.c
70
71
2015-04-25追加
演習: 値を表示してみよう3(2/2)
• 5行目はファイル名と対応させて2ページ前の
a, lf, vt, cr の宣言と初期化に書き換え。
• 6行目は %d を %x に書き換え。hex は、対応
する a, lf, vt, cr に書き換え
1
2
3
4
5
6
7
printf_practice_a.c
mintty + bash + gcc
#include <stdio.h>
$ gcc printf_practice_a.c && ./a
61
void main()
{
char a = 'a';
printf("%x\n", a);
}
5,6行目の赤字部分を書き変え
計4つのファイルを作りましょう。
コマンドプロンプト + Borland C++
>bcc32 printf_practice_a.c && printf_practice_a
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, ...
printf_practive_11.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, ...
61
72
教科書 p.56.
エスケープシーケンス
\a
\b
\f
\n
\r
\t
\v
警告(ベル)文字
バックスペース
改頁(フォームフィード)
改行
復帰
水平タブ
垂直タブ
これらの表記は、
1文字(=1バイト)の値を表す。
\\
\?
\'
\"
\ooo
\xhh
バックスラッシュ
疑問符
単一引用符
二重引用符
8進数 ooo (*1)
16進数 hh (*2)
(*1) ooo は1桁ないし
3桁の8進数を取る
(*2) hh は1桁あるいは
2桁の16進数を取る
73
備考
幅広文字定数のリテラル
• char型では表せない拡張文字セット用
• 文字定数の前に L を付ける
• wchar_t型の値になる
wchar_t hira_a = L'あ'; // 「あ」の文字コードU+3043?
Wikipedia / JIS_X_0213非漢字一覧#1面4区
http://ja.wikipedia.org/wiki/JIS_X_0213非漢字一覧#1.E9.9D.A24.E5.8C.BA
74
教科書 pp.44, 96-99.
文字列定数のリテラル
• 0個以上の文字を二重引用符(")で囲む
• char型の配列になる(後述)
二重引用符(")は
↑Shift
+
char emp[] = "";
// 空の文字列
char str[] = "I am a string";
// 文字列
char cat[] = "hello, " "world"; // "hello, world" と同じ
// 連続した文字定数リテラルはコンパイル時に連結される
"
2
75
宿題
• 次回までに以下の事をやっておくこと。
• 教科書の第2章の終わりまで読み、指示された操
作を試して動作を確認する。
• 不明な点、疑問点についてメモし、次回の授業に
持参する。または、本講義の Moodle コース上に
ある第1週宿題用フォーラムに書き込んでおく。