ja7ycqプログラミング勉強会 第2回 ~変数を理解しよう!~
DESCRIPTION
プログラミング勉強会 第2回のテーマは変数 メモリのイメージを頭に浮かべようTRANSCRIPT
プログラミング言語編
変数を理解しよう!
@jo7ueb
JA7YCQ プログラミング勉強会 #2
JA7YCQ SNCT Ham club
2
変数とは
● データを格納するための箱
出典: http://www.sgnet.co.jp/c/2-2.html
3
変数とは
● データを格納するための箱
出典: http://www.sgnet.co.jp/c/2-2.html
4
メモリから理解する!
5
メモリとは
● 主記憶装置という● 中央処理装置(CPU)と繋がっている● 処理が高速
http://japanese.engadget.com/2009/01/30/50nm-4gb-ddr3-32gb/
http://e-tech.life.hyogo-u.ac.jp/kyouzai/suihanki/comp/kousei.htm
6
メモリへのアクセス
● メモリの中には住所(アドレス)がある– 現実: 宮城県仙台市青葉区愛子中央4-16-1
– メモリ: 番号でアドレスを指定(0番, 1番, 2番…)
0番目
1番目
2番目
3番目
4番目
5番目
7
実際には
● メモリのアドレスはある一定のビット幅で表現– x86アーキテクチャだと32bit– アドレスでアクセスできる一連の空間をアドレス空間なんて言ったり
– アドレスは普通16進数で書く0x00000000番地
0x00000001番地
0x00000002番地
0x00000003番地
0x00000004番地
0x00000005番地
8
メモリ内のデータ配置
● データは各番地に1バイト格納される● 番地を指定して読み書きができる
12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
9
メモリ内のデータ配置
● データは各番地に1バイト格納される● 番地を指定して読み書きができる
12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
これでは1バイトのデータしか扱えないの?
10
メモリ内のデータ配置
● データは各番地に1バイト格納される● 番地を指定して読み書きができる
12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
これでは1バイトのデータしか扱えないの?
複数バイトをまとめて1つのデータを表現する!
11
バイトオーダのお話
● 複数バイトを使って1つのデータを表現するときに…– ビッグエンディアン
– リトルエンディアン
– ネットワークバイトオーダ
0x12345678 を格納するぜ!
下位アドレス
12
バイトオーダのお話
● 複数バイトを使って1つのデータを表現するときに…– ビッグエンディアン
– リトルエンディアン
– ネットワークバイトオーダ
12
34
56
78
0x12345678 を格納するぜ!
ビッグエンディアン
下位アドレス
13
バイトオーダのお話
● 複数バイトを使って1つのデータを表現するときに…– ビッグエンディアン
– リトルエンディアン
– ネットワークバイトオーダ
12
34
56
78
0x12345678 を格納するぜ!
78
56
34
12
ビッグエンディアン リトルエンディアン
下位アドレス
14
バイトオーダのお話
● 複数バイトを使って1つのデータを表現するときに…– ビッグエンディアン
– リトルエンディアン
– ネットワークバイトオーダ
12
34
56
78
0x12345678 を格納するぜ!
78
56
34
12
12
34
56
78
ビッグエンディアン リトルエンディアン ネットワークバイトオーダ
下位アドレス
15
演習: バイトオーダを練習しよう
● 4バイト符号あり整数で次の数を表現しよう– 154323 (ビッグエンディアン)
– 1202006(リトルエンディアン)
– -37311(リトルエンディアン)
– 3141592(ネットワークバイトオーダ)
16
演習: バイトオーダを練習しよう 解答編
● 4バイト符号あり整数で次の数を表現しよう– 154323 (ビッグエンディアン)
00 02 5A D3
– 1202006(リトルエンディアン)56 57 12 00
– -37311(リトルエンディアン)41 6E FF FF
– 3141592(ネットワークバイトオーダ)00 2F EF D8
補足資料
17
メモリ上の表現は分かったけど....
● プログラムからメモリを操作するときに考えなきゃいけないこと– 何番地にデータが入っているのか?
– 何バイトのデータなのか?
– 何のデータが入っているのか?
– エンディアンはどうなっているのか?
18
メモリ上の表現は分かったけど....
● プログラムからメモリを操作するときに考えなきゃいけないこと– 何番地にデータが入っているのか?
– 何バイトのデータなのか?
– 何のデータが入っているのか?
– エンディアンはどうなっているのか?
めんどくさすぎる!!!!
19
メモリ上の表現は分かったけど....
● プログラムからメモリを操作するときに考えなきゃいけないこと– 何番地にデータが入っているのか?
– 何バイトのデータなのか?
– 何のデータが入っているのか?
– エンディアンはどうなっているのか?
めんどくさすぎる!!!!
変数 ←救世主
20
救世主・変数
● 複雑なメモリアクセスを簡単にしてくれる魔法の薬
● 名前をつけて覚えやすくする 12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数
etc.
(エンディアンはCPU毎に決まります)
21
救世主・変数
● 複雑なメモリアクセスを簡単にしてくれる魔法の薬
● 名前をつけて覚えやすくする 12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数
etc.
(エンディアンはCPU毎に決まります)
1バイト整数: aznyan 2バイト整数: prnyan4バイト浮動小数点数: krnyan
22
もっと便利に!
● 名前をつけることでメモリをちょっと楽に扱えるようになった
● もっと楽にしたい!– 何バイト?
– 何のデータ?
1バイト整数: aznyan 2バイト整数: prnyan4バイト浮動小数点数: krnyan
データ型で表現する!
23
もっと便利に!
● 名前をつけることでメモリをちょっと楽に扱えるようになった
● もっと楽にしたい!– 何バイト?
– 何のデータ?
1バイト整数: aznyan 2バイト整数: prnyan4バイト浮動小数点数: krnyan
データ型で表現する!
24
もっと便利に!
● 名前をつけることでメモリをちょっと楽に扱えるようになった
● もっと楽にしたい!– 何バイト?
– 何のデータ?
1バイト整数: aznyan 2バイト整数: prnyan4バイト浮動小数点数: krnyan
char: aznyanshort: prnyanfloat: krnyan
データ型で表現する!
25
C言語におけるデータ型
名前 大きさ 種類
int 4 整数char 1 文字short 2 整数long 4 整数float 4 浮動小数点数double 8 浮動小数点数
補足資料
頭に signed をつけると符号あり(省略可能)unsigned をつけると符号なし
26
劇的!? ビフォーアフター 補足資料
12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
DE0x0006
● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数
27
劇的!? ビフォーアフター 補足資料
12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
DE0x0006
● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数
バイト列がずらーっとならぶ
28
劇的!? ビフォーアフター 補足資料
12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
DE0x0006
● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数
● char aznyan● short prnyan● float krnyan
名前: aznyan
型: char
中身: 0x12
名前: prnyan
型: short
中身: 0x5634
名前: krnyan
型: float
中身: 0xDEBC9A78
バイト列がずらーっとならぶ
29
劇的!? ビフォーアフター 補足資料
12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
DE0x0006
● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数
● char aznyan● short prnyan● float krnyan
名前: aznyan
型: char
中身: 0x12
名前: prnyan
型: short
中身: 0x5634
名前: krnyan
型: float
中身: 0xDEBC9A78
バイト列がずらーっとならぶ
データが箱に分けられているイメージ
30
変数とは
● データを格納するための箱
出典: http://www.sgnet.co.jp/c/2-2.html
補足資料
31
変数とは
● データを格納するための箱
出典: http://www.sgnet.co.jp/c/2-2.html
補足資料
32
変数と抽象化
● 変数を使うことで,メモリに関するややこしいことを考えなくても,データが扱えるようになった!
補足資料
抽象化という詳細を隠して,注目するべきことを絞ること
33
抽象化の反対は?
● 抽象化の対義語: 具象化● メモリアクセスを抽象化→ 変数● 変数を具象化するには?
– アドレスを得る: &演算子
– サイズを得る: sizeof()演算子
補足資料
34
変数の詳細を知る! 補足資料
12
34
56
78
9A
BC
0x0000
0x0001
0x0002
0x0003
0x0000
0x0004
0x0005
DE0x0006
● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数
名前: aznyan
型: char
中身: 0x12
名前: prnyan
型: short
中身: 0x5634
名前: krnyan
型: float
中身: 0xDEBC9A78
&aznyan → 0x0000&prnyan → 0x0001&krnyan → 0x0003
sizeof(aznyan) → 1sizeof(prnyan) → 2sizeof(krnyan) → 3
35
プログラムで変数を使うには?
● まずは変数を宣言する– 宣言するときに,同時に値を入れておくことができます(初期化)
– 初期化していない場合は,値は不定です
● 変数に値を代入する● 変数の値を使う
補足資料
36
変数を使ってみよう!#include <stdio.h> // OMAJINAI
int main(int argc, char **argv){ int sum = 0; // 初期化して宣言 int val1, val2; // 宣言しただけ val1 = 10; // val1に10を代入 val2 = 30; // val2に20を代入 sum = val1 + val2; // val1とval2の値を使って 計算,sumに代入 printf("%d\n", sum);}
補足資料
37
本資料の利用について
本資料はクリエイティブ・コモンズ 表示 - 継承 3.0 非移植 ライセンスの下に提供されています.ライセンスの詳細については,下記 URL をご参照ください.本資料の利用に際して,元データ(ODF形式)の提供を希望される方は作者までご連絡下さい.
http://creativecommons.org/licenses/by-sa/3.0/deed.ja
LibreOfficeについて本資料は LibreOffice Impress を利用して作成されています.LibreOffice は The Document Foundation が提供する自由でかつオープンソースのオフィススイートです.作者は LibreOfficeを応援しています.