データオブジェクトとその変換 - gunma...
TRANSCRIPT
データオブジェクトとその変換
データオブジェクトとは:変数と定数値(情報)はどのように表現され変換されるか
そもそも情報とは:複数の可能性の中から一つを指定するものコンピュータでは二つの状態を取り得るユニットを使って情報を保持する
Aまたは
B
(1)情報の対応表(2)
ユニット:状態「A」または「B」を取る
(リンゴ) (ノート)
(バナナ) (鉛筆)
2つの可能性の中から1つを指定する情報:1ビット(情報の基本量)
情報の対応表を変えれば、表現する情報は変わる
2つ以上の可能性の場合:複数のユニットを組み合わせる
AA
AB
B
BB
A
(リンゴ) (ノート)
(スイカ) (ボールペン)
(ナシ) (消しゴム)
(バナナ) (鉛筆)
2個のユニット(2ビット):4通りの可能性
n個のユニット(nビット):2 通りの可能性n
ユニットとは具体的には
メモリでは:コンデンサー
A: 電荷なしB: 電荷あり
CPUでは:フリップフロップ
A: 0VB: 3.3V
A: ピット有りB: ピット無し
CDでは:ピット磁気ディスクでは:磁極の向き
A:
B:
NS
NS
SN
NS
SN
SN
ディスク表面
NS
SN
QRコードでは:白黒の区画
A: 黒B: 白
C言語の基本データ型
(1)符号付整数:2の補数表現
(2)符号なし整数:2進数表現
(3)浮動小数点数:2進の浮動小数点表現
-2 ~2 -1(nー1) (nー1)
nビットの表現範囲:
8ビットならー128~127
8bit (1byte) 16bit (2byte) 32bit (4byte) 64bit (8byte)
8bit (1byte) 16bit (2byte) 32bit (4byte) 64bit (8byte)
0~2-1n
nビットの表現範囲:
8ビットなら0~255
32bit (4byte)64bit (8byte)
128bit (16byte)
最小の絶対値:(float) 1.175494×10 ,(double) 2.225074×10
最大の絶対値:(float) 3.402823×10 ,(double) 1.797693×10 38
-38 -308
308
(2)符号なし整数の表現(ビットパターンへの割り当て)
AA
AB
B
BB
A
1 2 3 0
0 2 0 3
3 3 1 2
2 1 2 1
00
01
1
11
0
2ビットの場合、4種類の整数(0,1,2,3)が表現可能。
原理的には様々な割り当てが可能だが、数の場合計算(加減乗除)の効率を考慮する必要がある。
A⇒0,B⇒1と対応付けて、2進数で表現する。
数の表記法と二進数
(1)一対一対応による記録
(2)数に名前を付けて記録
石 結び目 印
問題:場所を取りすぎ
問題:常に新しい記号(名前)が必要になる
ユニット
A A A B B …
Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,…,Ⅹ,...,Ⅽ,…,Ⅿ(Ⅹ=10,Ⅽ=100,Ⅿ=1000)
一,二,三,四,…,九,十,…,百,…,千,…,万,…,無量大数(無量大数=10 )
68
数の表記法
(3)位取り記数法による記録
利点:10個の記号で表記できる0,1,2,3,4,5,6,7,8,9
10個まとまったら桁を上げる(10進法)
25=(10)×2+1×5
5
2
n進数による表記
n進法:n個になったらまとめる(桁を上げる)
10進法
3進法
2進法
1
1
1
1
1
1
1
1
0
0
1
1
2
2
0
0
1
1
10×1 + 1 (2×2×2)×1 +(2×2)×0 + 2×1 + 1
(3×3)×1 + 3×0 + 2
(2)符号なし整数:2進数表現
8bit (1byte) 16bit (2byte) 32bit (4byte) 64bit (8byte)
0~2-1n
nビットの表現範囲:
8ビットなら0~255
AAAAAAAA 00000000 0(10)
AAAAAAAB 00000001 1(10)
AAAAAABA 00000010 2(10)
AAAAAABB 00000011 3(10)
BBBBBBBA 11111110 126(10)
BBBBBBBB 11111111 127(10)
(1)符号つき整数の表現
①絶対値表現:最初のビットを符号として0⇒+、1⇒ーとする。②2の補数表現:負数を16の補数(16-|x|)で表す。
0 0 0 00 0 0 10 0 1 00 0 1 10 1 0 00 1 0 10 1 1 00 1 1 11 0 0 01 0 0 11 0 1 01 0 1 11 1 0 01 1 0 11 1 1 01 1 1 1
A⇒0,B⇒1で表記する
+0+1+2+3+4+5+6+7ー0ー1
ー2ー3ー4ー5
ー6
ー7
+0+1+2+3+4+5+6+7ー8ー7
ー6ー5ー4ー3
ー2
ー1
0123456789
10111213
14
15
2の補数表現の利点:減算器が要らない。
0 0 0 00 0 0 10 0 1 00 0 1 10 1 0 00 1 0 10 1 1 00 1 1 11 0 0 01 0 0 11 0 1 01 0 1 11 1 0 01 1 0 11 1 1 01 1 1 1
+0+1+2+3+4+5+6+7ー8ー7
ー6ー5ー4ー3
ー2
ー1
5+(-3)0101
+110110010⇒0010=3(10)
(-1)+(-4)
1111+110011011⇒1011=-5(10)
(-6)+31010
+00111101⇒1011=-3(10)
アイディア:負数xを、その絶対値|x|を足すと10000(2)(=16(10))になる正数で表す。
その正数は10000(2)に|x|だけ足りない数になる。
ある数と加算すると5桁目の1はオーバーフローでなくなるので、|x|だけ減じられる。
補数表現の作り方:
0011(1) 1100(2)+ 1
1101
3
ー3
1101(1) 0010(2)+ 1
0011
ー3
3
0101(1) 1010(2)+ 1
1011
5
ー5
1011(1) 0100(2)+ 1
0101
ー5
5
(1)0と1を反転する(2)1を足す
MSBが1の場合は負数
XXXXXXXX
MSB (Most Significant Bit) LSB (Least Significant Bit)
(足して 1111になる数になる)(足して10000になる数になる)
10進数でも補数による減算は可能パスカルの計算機(パスカリーヌ)で使用されている
ブーレーズ・パスカルが1640年代に作成した機械式計算機。歯車機構を単純にするため、加算機能しか持たない。
10進3桁の場合、負数xを、|x|と加えて1000になる正数で表す。
補数表現の作り方:
(1)各桁を足して9になる数に置き換える
(2)1を足す(足して 999になる数になる)(足して1000になる数になる)
125
ー125
125(1) 874(2)+ 1
875
212+(-125)=87
212+8751087 ⇒ 087
125+(-125)=0
125+8751000 ⇒ 000
(3)浮動小数点数:2進の浮動小数点表現
固定小数点表現 整数と同じ機構で保持できる
3 1 4 1 5 9 2 6
小数点単位量
10倍 1/10倍
1/1000
1 0 0 1 0 1 0 1
小数点単位量
2倍 1/2倍
1/2 = 1/164
問題:値の範囲が狭い
0 0 0 0 0 0 0 03 1 4 1 0 0
0 0 3 1 4 10 0 0 0 0 0 0 0
3.141×109
3.141×10-7
浮動小数点表現 小数点の位置を指定する
3.141×109
3.141×10-7
0 0 0 0 0 0 0 03 1 4 1 0 0
3 1 4 1 0 0 0 0 0 0 0 0 0 0
+ 7基準位置
3 1 4 1 0 0 0 0
基準位置
0 0 3 1 4 10 0 0 0 0 0 0 0
0 0 0 0 0 0 0
- 7
X X X X X X X X S Y仮数部 指数部
Float の表現(IEEE 754)
s e f
s:サインビット 1 ⇒―,0 ⇒+e:指数部 8ビット バイアス付き2進表現f:仮数部 23ビット 固定小数点表現 小数点はビット22の左側
ただしe=0, f=0 ⇒値=0e=255, f=0 ⇒値=無限大e=255, f=0以外⇒ NaN(Not a Number)
不正な演算結果など、数でないことを表す。
e - 127 = 01111100(2) - 127 = 124 - 127 = -3, 1.f = 1.01(2) = 1.25
値 = (-1) × 1.25 × 2 = 1.25 × 1/8 = 1.25 ×0.125 = 0.156250 -3
float vs int:どちらが制度が良い?
float は小数点以下の数も表せるが intは整数部のみ。しかしどちらも 32bit 、2 種類の数しか表せない。
32
仮数部の精度:10進で6~7桁
最小の絶対値:1.175494×10 , 最大の絶対値:3.402823×10 38-38
0 1 2-1-2-2147483648
-2147483647
-2147483646 2147483647
2147483646
2147483645
int
0
1×10-38
2×10-38
-1×10-38
-2×10-38
1.00000×1038
1.00001×1038
-1.00000×1038
-1.00001×1038
1×1033
1×1033
float
データ型の変換
大から小の整数:同じビットパターンが代入される
unsigned int int
= A B C DA B C D
int si;unsigned int ui;si = -1;ui = si; uiの値は4294967295に
同サイズの整数:同じビットパターンが代入される
(例)
short int= A B C DC D
(例)
小から大の整数:下位ビットに代入
=int
0/1 0/1 A B
(unsigned) short
A B
(例)
上位ビットは・小が unsigned の場合:符号拡張(AのMSBをコピー)・小が signed の場合:0を代入
=A B A BMSB
1111111111111111 100000000000000000
符号拡張
小が負の場合に大も同じ値
-10(10) = 11111111 11110110 = 11110110(例)16bit 8bit
0 1 2 3 4 5-1-2-3-4-5
方法1
方法2
浮動小数点数→ 整数正の値:小数点以下切り捨て負の値:大小どちらに切り捨てられるかは機種依存
整数→ 浮動小数点数対応する値がある:整数と同じ値対応する値が無い:規定なし
定数 (リテラル) の表現整数: 10 進表現 (9999),8 進表現 (07777),16 進表現 (0XFFFF) 浮動小数点数: 小数点表現 (999.9),指数表現 (9.99E99)
文字の表現文字コード(文字の番号)で表す
int i;i = ’A’;printf(”%d¥n”,i);
何が出力される?
非文字コード:改行( ¥n など)
文字定数による表現(’A’など)
エスケープシーケンス(系列)による表現(教科書46ページ)
¥a 警報音¥b バックスペース¥n 復帰改行¥r 復帰¥f 改ページ¥t 水平タブ¥v 垂直タブ
¥¥ 文字としての¥¥? 文字としての?¥‘ シングルクォーテーション¥“ ダブルクォーテーション¥0 Null(値0の整数)¥ooo 8進数の文字コードを持つ文字¥xhh 16進数の文字コードを持つ文字
古いコンピュータ
テレタイプ
ASCIIコードで文字を送る
コンピュータの入出力に使える
本来のテレタイプの使い方
ASCIIコードで文字を送る
電話回線