ja7ycqプログラミング勉強会 第2回 ~変数を理解しよう!~

37
プログラミング言語編 変数を理解しよう! @jo7ueb JA7YCQ プログラミング勉強会 #2 JA7YCQ SNCT Ham club

Upload: neppo-telewisteria

Post on 24-May-2015

195 views

Category:

Technology


5 download

DESCRIPTION

プログラミング勉強会 第2回のテーマは変数 メモリのイメージを頭に浮かべよう

TRANSCRIPT

Page 1: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

プログラミング言語編

変数を理解しよう!

@jo7ueb

JA7YCQ プログラミング勉強会 #2

 

JA7YCQ SNCT Ham club

Page 2: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

2

変数とは

● データを格納するための箱

出典: http://www.sgnet.co.jp/c/2-2.html

Page 3: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

3

変数とは

● データを格納するための箱

出典: http://www.sgnet.co.jp/c/2-2.html

Page 4: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

4

メモリから理解する!

Page 5: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

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

Page 6: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

6

メモリへのアクセス

● メモリの中には住所(アドレス)がある– 現実: 宮城県仙台市青葉区愛子中央4-16-1

– メモリ: 番号でアドレスを指定(0番, 1番, 2番…)

0番目

1番目

2番目

3番目

4番目

5番目

Page 7: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

7

実際には

● メモリのアドレスはある一定のビット幅で表現– x86アーキテクチャだと32bit– アドレスでアクセスできる一連の空間をアドレス空間なんて言ったり

– アドレスは普通16進数で書く0x00000000番地

0x00000001番地

0x00000002番地

0x00000003番地

0x00000004番地

0x00000005番地

Page 8: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

8

メモリ内のデータ配置

● データは各番地に1バイト格納される● 番地を指定して読み書きができる

12

34

56

78

9A

BC

0x0000

0x0001

0x0002

0x0003

0x0000

0x0004

0x0005

Page 9: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

9

メモリ内のデータ配置

● データは各番地に1バイト格納される● 番地を指定して読み書きができる

12

34

56

78

9A

BC

0x0000

0x0001

0x0002

0x0003

0x0000

0x0004

0x0005

これでは1バイトのデータしか扱えないの?

Page 10: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

10

メモリ内のデータ配置

● データは各番地に1バイト格納される● 番地を指定して読み書きができる

12

34

56

78

9A

BC

0x0000

0x0001

0x0002

0x0003

0x0000

0x0004

0x0005

これでは1バイトのデータしか扱えないの?

複数バイトをまとめて1つのデータを表現する!

Page 11: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

11

バイトオーダのお話

● 複数バイトを使って1つのデータを表現するときに…– ビッグエンディアン

– リトルエンディアン

– ネットワークバイトオーダ

0x12345678 を格納するぜ!

下位アドレス

Page 12: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

12

バイトオーダのお話

● 複数バイトを使って1つのデータを表現するときに…– ビッグエンディアン

– リトルエンディアン

– ネットワークバイトオーダ

12

34

56

78

0x12345678 を格納するぜ!

ビッグエンディアン

下位アドレス

Page 13: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

13

バイトオーダのお話

● 複数バイトを使って1つのデータを表現するときに…– ビッグエンディアン

– リトルエンディアン

– ネットワークバイトオーダ

12

34

56

78

0x12345678 を格納するぜ!

78

56

34

12

ビッグエンディアン リトルエンディアン

下位アドレス

Page 14: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

14

バイトオーダのお話

● 複数バイトを使って1つのデータを表現するときに…– ビッグエンディアン

– リトルエンディアン

– ネットワークバイトオーダ

12

34

56

78

0x12345678 を格納するぜ!

78

56

34

12

12

34

56

78

ビッグエンディアン リトルエンディアン ネットワークバイトオーダ

下位アドレス

Page 15: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

15

演習: バイトオーダを練習しよう

● 4バイト符号あり整数で次の数を表現しよう– 154323 (ビッグエンディアン)

– 1202006(リトルエンディアン)

– -37311(リトルエンディアン)

– 3141592(ネットワークバイトオーダ)

Page 16: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

16

演習: バイトオーダを練習しよう 解答編

● 4バイト符号あり整数で次の数を表現しよう– 154323 (ビッグエンディアン)

00 02 5A D3

– 1202006(リトルエンディアン)56 57 12 00

– -37311(リトルエンディアン)41 6E FF FF

– 3141592(ネットワークバイトオーダ)00 2F EF D8

補足資料

Page 17: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

17

メモリ上の表現は分かったけど....

● プログラムからメモリを操作するときに考えなきゃいけないこと– 何番地にデータが入っているのか?

– 何バイトのデータなのか?

– 何のデータが入っているのか?

– エンディアンはどうなっているのか?

Page 18: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

18

メモリ上の表現は分かったけど....

● プログラムからメモリを操作するときに考えなきゃいけないこと– 何番地にデータが入っているのか?

– 何バイトのデータなのか?

– 何のデータが入っているのか?

– エンディアンはどうなっているのか?

めんどくさすぎる!!!!

Page 19: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

19

メモリ上の表現は分かったけど....

● プログラムからメモリを操作するときに考えなきゃいけないこと– 何番地にデータが入っているのか?

– 何バイトのデータなのか?

– 何のデータが入っているのか?

– エンディアンはどうなっているのか?

めんどくさすぎる!!!!

変数 ←救世主

Page 20: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

20

救世主・変数

● 複雑なメモリアクセスを簡単にしてくれる魔法の薬

● 名前をつけて覚えやすくする 12

34

56

78

9A

BC

0x0000

0x0001

0x0002

0x0003

0x0000

0x0004

0x0005

● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数

etc.

(エンディアンはCPU毎に決まります)

Page 21: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

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

Page 22: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

22

もっと便利に!

● 名前をつけることでメモリをちょっと楽に扱えるようになった

● もっと楽にしたい!– 何バイト?

– 何のデータ?

1バイト整数: aznyan 2バイト整数: prnyan4バイト浮動小数点数: krnyan

データ型で表現する!

Page 23: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

23

もっと便利に!

● 名前をつけることでメモリをちょっと楽に扱えるようになった

● もっと楽にしたい!– 何バイト?

– 何のデータ?

1バイト整数: aznyan 2バイト整数: prnyan4バイト浮動小数点数: krnyan

データ型で表現する!

Page 24: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

24

もっと便利に!

● 名前をつけることでメモリをちょっと楽に扱えるようになった

● もっと楽にしたい!– 何バイト?

– 何のデータ?

1バイト整数: aznyan 2バイト整数: prnyan4バイト浮動小数点数: krnyan

char: aznyanshort: prnyanfloat: krnyan

データ型で表現する!

Page 25: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

25

C言語におけるデータ型

名前 大きさ 種類

int 4 整数char 1 文字short 2 整数long 4 整数float 4 浮動小数点数double 8 浮動小数点数

補足資料

頭に signed をつけると符号あり(省略可能)unsigned をつけると符号なし

Page 26: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

26

劇的!? ビフォーアフター 補足資料

12

34

56

78

9A

BC

0x0000

0x0001

0x0002

0x0003

0x0000

0x0004

0x0005

DE0x0006

● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数

Page 27: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

27

劇的!? ビフォーアフター 補足資料

12

34

56

78

9A

BC

0x0000

0x0001

0x0002

0x0003

0x0000

0x0004

0x0005

DE0x0006

● 0番地から1バイト整数● 1番地から2バイト整数● 3番地から4バイト浮動小数点数

バイト列がずらーっとならぶ

Page 28: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

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

バイト列がずらーっとならぶ

Page 29: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

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

バイト列がずらーっとならぶ

データが箱に分けられているイメージ

Page 30: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

30

変数とは

● データを格納するための箱

出典: http://www.sgnet.co.jp/c/2-2.html

補足資料

Page 31: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

31

変数とは

● データを格納するための箱

出典: http://www.sgnet.co.jp/c/2-2.html

補足資料

Page 32: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

32

変数と抽象化

● 変数を使うことで,メモリに関するややこしいことを考えなくても,データが扱えるようになった!

補足資料

抽象化という詳細を隠して,注目するべきことを絞ること

Page 33: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

33

抽象化の反対は?

● 抽象化の対義語: 具象化● メモリアクセスを抽象化→ 変数● 変数を具象化するには?

– アドレスを得る: &演算子

– サイズを得る: sizeof()演算子

補足資料

Page 34: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

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

Page 35: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

35

プログラムで変数を使うには?

● まずは変数を宣言する– 宣言するときに,同時に値を入れておくことができます(初期化)

– 初期化していない場合は,値は不定です

● 変数に値を代入する● 変数の値を使う

補足資料

Page 36: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

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);}

補足資料

Page 37: JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~

37

本資料の利用について

本資料はクリエイティブ・コモンズ 表示 - 継承 3.0 非移植 ライセンスの下に提供されています.ライセンスの詳細については,下記 URL をご参照ください.本資料の利用に際して,元データ(ODF形式)の提供を希望される方は作者までご連絡下さい.

http://creativecommons.org/licenses/by-sa/3.0/deed.ja

LibreOfficeについて本資料は LibreOffice Impress を利用して作成されています.LibreOffice は The Document Foundation が提供する自由でかつオープンソースのオフィススイートです.作者は LibreOfficeを応援しています.