狠狠撸

狠狠撸Share a Scribd company logo
東北大学 工学部 機械知能?航空工学科
2015年度 5セメスター?クラスD
計算機工学
大学院情報科学研究科
鏡 慎吾
http://www.ic.is.tohoku.ac.jp/~swk/lecture/
3. 数の表現 ― 符号つき整数
(教科書1.2節)
2鏡 慎吾 (東北大学): 計算機工学 2015 (3)
負の数の表現
素朴な方法 (符号と絶対値法)
通常我々は,10進数の絶対値の前に – をつけて負の数を表す.
同様に,最上位ビットで符号を表し,残りで絶対値を表せばよい
10111011
符号ビット:
0: 正
1: 負
絶対値
問題点:
?ゼロの表現が2通り存在する
?加減算が煩雑になる
→ 通常は,2の補数表示と呼ばれる方式が用いられる
3鏡 慎吾 (東北大学): 計算機工学 2015 (3)
「2の補数」表現による符号つき数
111 7
110 6
101 5
100 4
011 3
010 2
001 1
000 0
3ビットの場合:
2進のビット列 符号なし数
-1
-2
-3
-4
3
2
1
0
2の補数表現による符号つき数
000から1ずつ減らして行ったと
きの表現を素直に考えるとよい
? 一般にnビットの場合,
– 2n-1 ~ (2n-1 – 1)
の範囲の数を表せる
? MSBが1であれば,負
の数である
C言語では,各種の整数型に符号
なし,符号つきの種類がある.
signed int, unsigned int
signed short, unsigned short
signed char, unsigned char
4鏡 慎吾 (東北大学): 計算機工学 2015 (3)
2の補数の定義
n ビットの 2 進数において,ある数 x の
「2の補数 (2’s complement)」とは,
2n – x
である
(8 ビットなら,256 – x になる)
2の補数表示による n ビットの符号つき数とは,
? 非負の数 x (0≦x ≦ 2n–1 – 1) を x の符号なし2進表示で,
? 負の数 –x (0 < x ≦ 2n–1) を x の「2の補数」,すなわち (2n – x)
の符号なし2進表示で
表したものである
5鏡 慎吾 (東北大学): 計算機工学 2015 (3)
2の補数が使われる理由
01111010 = 122(10)
+) 11111111 = -1(10)
101111001 = 121(10)
なぜこのようにうまく行くのか? → 循環しているのがミソ
8ビットの場合,28を足すと一巡して元の数に戻る
28 – 1 を足すと,元の数より 1 少ない数に落ち着く
28 – x を足すと,元の数より x 少ない数に落ち着く (= 減算)
(符号と絶対値法だと,数の並ぶ順序が変わってしまうのでこうはいかない:
0, 1, 2, …, 126, 127, -0, -1, -2, …, -126, -127)
はみ出したビットは捨てる
符号を気にせず加算?減算を実行することができる
6鏡 慎吾 (東北大学): 計算機工学 2015 (3)
例題
ファミリーコンピュータ用ゲーム「スーパーマリオブラザーズ」(任
天堂(株), 1985年) には,「無限1up」「無限増殖」などと呼ばれる
テクニックが存在したことが知られている.すなわち,ある操作を
行うことで,プレイヤストック数 (ゲームオーバになるまでに許容さ
れるミスの回数,残機数) を際限なく増加させ続けることが可能で
あった.
一方,プレイヤストックを一定数以上に増やしすぎると,その後
たった一度のミスでゲームオーバになってしまうという現象も生じ
た.内部でどのような処理が行われていたか推測して述べよ.
8鏡 慎吾 (東北大学): 計算機工学 2015 (3)
2の補数表現の符号つき数の操作
? 加減算
? 加算はそのまま計算するだけだということが分かった
? 減算は,『引く数」に負号をつけて2の補数で表し,加算を
実行すればよい: 100 – 30 = 100 + (-30)
? では,符号反転を行うには?
? 符号反転(2の補数変換)
? 「ビットを反転して1を足す」
? 2の補数表現 と 普通の10進正負の数の相互変換
9鏡 慎吾 (東北大学): 計算機工学 2015 (3)
符号反転
x = 30 (10) → 00011110 (2)
-x = -30 (10) → ? (2)
x の2の補数 = 2n – x = (2n – 1) – x + 1
111…111 (1がn個並んだもの)
11111111
-) 00011110
11100001
繰り下がりが起きない!
結局 1 と 0 を反転させるだけ
(「1の補数」と呼ばれる)
それに1を足すと,符号反転結
果が得られる
11100001
+) 00000001
11100010
結論: 符号反転をするには,各ビットを反転し,1を加えればよい
正→負,負→正 のどちらでもOK (∵2n – (2n - x) = x)
10鏡 慎吾 (東北大学): 計算機工学 2015 (3)
10進の正負の数との変換
10進 → 2進:
? 絶対値を2進数で表現
? 正の数であれば,それで終わり
? 負の数であれば,符号反転処理
2進 → 10進:
? MSBが0か1か?
? 0であれば非負なので,そのまま10進数へ変換
? 1であれば負なので,
? 符号反転処理をしてから10進数へ変換し,負号を
つける
? または,まず10進数へ変換して,それを2nから引
いて,負号をつける
11鏡 慎吾 (東北大学): 計算機工学 2015 (3)
例題
1. 10010110 (2進8ビット,2の補数表現の符号つき数) を10進
数に変換せよ
2. –50 (10進数) を 8 ビットの2の補数表現の符号つき2進数で
表せ.
12鏡 慎吾 (東北大学): 計算機工学 2015 (3)
例題 解答例
1. MSB = 1なので負の数である.
方法1) まず符号反転処理してから10進に変換し,負号をつける
10010110
→ 01101001
+) 1
01101010 → 106 → -106
方法2) まず10進数に変換して,それを256から引いて負号をつける
10010110
→ 01101001
+) 1
01101010 → 106 → -106
10010110 (正数だと思って変換)
→ 150
→ -(256-150)= -106
2. 50 を符号反転する.50 = 32 + 16 + 2 = 00110010(2) なので,
11001101 + 1 = 11001110
13鏡 慎吾 (東北大学): 計算機工学 2015 (3)
符号拡張とゼロ拡張
あるビット長の2進数を,より長いビット長の2進数に変換すると
き,MSB 側を符号ビットで埋める方法を符号拡張と呼ぶ.2の
補数表示の符号つき数の拡張の際に用いられる.
11111111 11111000 = –8(10)
11111111 11111111 11111111 11111000
00000000 00001000 = 8 (10)
00000000 00000000 00000000 00001000
16ビットから32ビットへの符号拡張の例:
これに対して,常にゼロで埋める方法をゼロ拡張と呼ぶ.符号
なし数の拡張に用いられる.
= 8 (10)
= –8(10)
(–8 : 「あと8 増やせば 2n になる数」)
14鏡 慎吾 (東北大学): 計算機工学 2015 (3)
練習問題
8ビットの符号つき数
(a) 00101100
(b) 11101101
(c) 10100101
をそれぞれ,
1) 10 進数,16進数で表せ
2) 符号を反転した数を,2の補数表示の符号つき数で表せ
3) 16ビットに符号拡張せよ
4) (a) を 3ビット右シフトし,元の数の8分の1になっている
かどうか調べよ.
15鏡 慎吾 (東北大学): 計算機工学 2015 (3)
練習問題 解答例
1) 10進数: (a) 44 (b) – 19 (c) – 91
16進数: (a) 2c (b) ed (c) a5
2) (a) 11010100 (b) 00010011 (c) 01011011
3) (a) 00000000 00101100 (b) 11111111 11101101
(c) 11111111 10100101
4) 000000101 (44/8 の小数点以下切捨てになっている)
1) 正の数は普通に変換する.負の数は,10進にしてから 28 から引くか,符号
反転してから10進にするか.どうせ(2)で符号反転するんだから,後者の方
が楽かも.
2) ビット反転して 1 を足す.
3) MSBで拡張する.
4) 定義どおり計算.

More Related Content

More from swkagami (20)

kagamicomput201814
kagamicomput201814kagamicomput201814
kagamicomput201814
swkagami
?
kagamicomput201813
kagamicomput201813kagamicomput201813
kagamicomput201813
swkagami
?
kagamicomput201812
kagamicomput201812kagamicomput201812
kagamicomput201812
swkagami
?
kagamicomput201811
kagamicomput201811kagamicomput201811
kagamicomput201811
swkagami
?
kagamicomput201810
kagamicomput201810kagamicomput201810
kagamicomput201810
swkagami
?
kagamicomput201809
kagamicomput201809kagamicomput201809
kagamicomput201809
swkagami
?
kagamicomput201808
kagamicomput201808kagamicomput201808
kagamicomput201808
swkagami
?
kagamicomput201807
kagamicomput201807kagamicomput201807
kagamicomput201807
swkagami
?
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806
swkagami
?
kagamicomput201805
kagamicomput201805kagamicomput201805
kagamicomput201805
swkagami
?
kagamicomput201804
kagamicomput201804kagamicomput201804
kagamicomput201804
swkagami
?
kagamicomput201802
kagamicomput201802kagamicomput201802
kagamicomput201802
swkagami
?
kagamicomput201801
kagamicomput201801kagamicomput201801
kagamicomput201801
swkagami
?
kagamicomput201714
kagamicomput201714kagamicomput201714
kagamicomput201714
swkagami
?
kagamicomput201713
kagamicomput201713kagamicomput201713
kagamicomput201713
swkagami
?
kagamicomput201712
kagamicomput201712kagamicomput201712
kagamicomput201712
swkagami
?
kagamicomput201711
kagamicomput201711kagamicomput201711
kagamicomput201711
swkagami
?
kagamicomput201710
kagamicomput201710kagamicomput201710
kagamicomput201710
swkagami
?
kagamicomput201709
kagamicomput201709kagamicomput201709
kagamicomput201709
swkagami
?
kagamicomput201708
kagamicomput201708kagamicomput201708
kagamicomput201708
swkagami
?
kagamicomput201814
kagamicomput201814kagamicomput201814
kagamicomput201814
swkagami
?
kagamicomput201813
kagamicomput201813kagamicomput201813
kagamicomput201813
swkagami
?
kagamicomput201812
kagamicomput201812kagamicomput201812
kagamicomput201812
swkagami
?
kagamicomput201811
kagamicomput201811kagamicomput201811
kagamicomput201811
swkagami
?
kagamicomput201810
kagamicomput201810kagamicomput201810
kagamicomput201810
swkagami
?
kagamicomput201809
kagamicomput201809kagamicomput201809
kagamicomput201809
swkagami
?
kagamicomput201808
kagamicomput201808kagamicomput201808
kagamicomput201808
swkagami
?
kagamicomput201807
kagamicomput201807kagamicomput201807
kagamicomput201807
swkagami
?
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806
swkagami
?
kagamicomput201805
kagamicomput201805kagamicomput201805
kagamicomput201805
swkagami
?
kagamicomput201804
kagamicomput201804kagamicomput201804
kagamicomput201804
swkagami
?
kagamicomput201802
kagamicomput201802kagamicomput201802
kagamicomput201802
swkagami
?
kagamicomput201801
kagamicomput201801kagamicomput201801
kagamicomput201801
swkagami
?
kagamicomput201714
kagamicomput201714kagamicomput201714
kagamicomput201714
swkagami
?
kagamicomput201713
kagamicomput201713kagamicomput201713
kagamicomput201713
swkagami
?
kagamicomput201712
kagamicomput201712kagamicomput201712
kagamicomput201712
swkagami
?
kagamicomput201711
kagamicomput201711kagamicomput201711
kagamicomput201711
swkagami
?
kagamicomput201710
kagamicomput201710kagamicomput201710
kagamicomput201710
swkagami
?
kagamicomput201709
kagamicomput201709kagamicomput201709
kagamicomput201709
swkagami
?
kagamicomput201708
kagamicomput201708kagamicomput201708
kagamicomput201708
swkagami
?

kagami_comput2015_3

  • 1. 東北大学 工学部 機械知能?航空工学科 2015年度 5セメスター?クラスD 計算機工学 大学院情報科学研究科 鏡 慎吾 http://www.ic.is.tohoku.ac.jp/~swk/lecture/ 3. 数の表現 ― 符号つき整数 (教科書1.2節)
  • 2. 2鏡 慎吾 (東北大学): 計算機工学 2015 (3) 負の数の表現 素朴な方法 (符号と絶対値法) 通常我々は,10進数の絶対値の前に – をつけて負の数を表す. 同様に,最上位ビットで符号を表し,残りで絶対値を表せばよい 10111011 符号ビット: 0: 正 1: 負 絶対値 問題点: ?ゼロの表現が2通り存在する ?加減算が煩雑になる → 通常は,2の補数表示と呼ばれる方式が用いられる
  • 3. 3鏡 慎吾 (東北大学): 計算機工学 2015 (3) 「2の補数」表現による符号つき数 111 7 110 6 101 5 100 4 011 3 010 2 001 1 000 0 3ビットの場合: 2進のビット列 符号なし数 -1 -2 -3 -4 3 2 1 0 2の補数表現による符号つき数 000から1ずつ減らして行ったと きの表現を素直に考えるとよい ? 一般にnビットの場合, – 2n-1 ~ (2n-1 – 1) の範囲の数を表せる ? MSBが1であれば,負 の数である C言語では,各種の整数型に符号 なし,符号つきの種類がある. signed int, unsigned int signed short, unsigned short signed char, unsigned char
  • 4. 4鏡 慎吾 (東北大学): 計算機工学 2015 (3) 2の補数の定義 n ビットの 2 進数において,ある数 x の 「2の補数 (2’s complement)」とは, 2n – x である (8 ビットなら,256 – x になる) 2の補数表示による n ビットの符号つき数とは, ? 非負の数 x (0≦x ≦ 2n–1 – 1) を x の符号なし2進表示で, ? 負の数 –x (0 < x ≦ 2n–1) を x の「2の補数」,すなわち (2n – x) の符号なし2進表示で 表したものである
  • 5. 5鏡 慎吾 (東北大学): 計算機工学 2015 (3) 2の補数が使われる理由 01111010 = 122(10) +) 11111111 = -1(10) 101111001 = 121(10) なぜこのようにうまく行くのか? → 循環しているのがミソ 8ビットの場合,28を足すと一巡して元の数に戻る 28 – 1 を足すと,元の数より 1 少ない数に落ち着く 28 – x を足すと,元の数より x 少ない数に落ち着く (= 減算) (符号と絶対値法だと,数の並ぶ順序が変わってしまうのでこうはいかない: 0, 1, 2, …, 126, 127, -0, -1, -2, …, -126, -127) はみ出したビットは捨てる 符号を気にせず加算?減算を実行することができる
  • 6. 6鏡 慎吾 (東北大学): 計算機工学 2015 (3) 例題 ファミリーコンピュータ用ゲーム「スーパーマリオブラザーズ」(任 天堂(株), 1985年) には,「無限1up」「無限増殖」などと呼ばれる テクニックが存在したことが知られている.すなわち,ある操作を 行うことで,プレイヤストック数 (ゲームオーバになるまでに許容さ れるミスの回数,残機数) を際限なく増加させ続けることが可能で あった. 一方,プレイヤストックを一定数以上に増やしすぎると,その後 たった一度のミスでゲームオーバになってしまうという現象も生じ た.内部でどのような処理が行われていたか推測して述べよ.
  • 7. 8鏡 慎吾 (東北大学): 計算機工学 2015 (3) 2の補数表現の符号つき数の操作 ? 加減算 ? 加算はそのまま計算するだけだということが分かった ? 減算は,『引く数」に負号をつけて2の補数で表し,加算を 実行すればよい: 100 – 30 = 100 + (-30) ? では,符号反転を行うには? ? 符号反転(2の補数変換) ? 「ビットを反転して1を足す」 ? 2の補数表現 と 普通の10進正負の数の相互変換
  • 8. 9鏡 慎吾 (東北大学): 計算機工学 2015 (3) 符号反転 x = 30 (10) → 00011110 (2) -x = -30 (10) → ? (2) x の2の補数 = 2n – x = (2n – 1) – x + 1 111…111 (1がn個並んだもの) 11111111 -) 00011110 11100001 繰り下がりが起きない! 結局 1 と 0 を反転させるだけ (「1の補数」と呼ばれる) それに1を足すと,符号反転結 果が得られる 11100001 +) 00000001 11100010 結論: 符号反転をするには,各ビットを反転し,1を加えればよい 正→負,負→正 のどちらでもOK (∵2n – (2n - x) = x)
  • 9. 10鏡 慎吾 (東北大学): 計算機工学 2015 (3) 10進の正負の数との変換 10進 → 2進: ? 絶対値を2進数で表現 ? 正の数であれば,それで終わり ? 負の数であれば,符号反転処理 2進 → 10進: ? MSBが0か1か? ? 0であれば非負なので,そのまま10進数へ変換 ? 1であれば負なので, ? 符号反転処理をしてから10進数へ変換し,負号を つける ? または,まず10進数へ変換して,それを2nから引 いて,負号をつける
  • 10. 11鏡 慎吾 (東北大学): 計算機工学 2015 (3) 例題 1. 10010110 (2進8ビット,2の補数表現の符号つき数) を10進 数に変換せよ 2. –50 (10進数) を 8 ビットの2の補数表現の符号つき2進数で 表せ.
  • 11. 12鏡 慎吾 (東北大学): 計算機工学 2015 (3) 例題 解答例 1. MSB = 1なので負の数である. 方法1) まず符号反転処理してから10進に変換し,負号をつける 10010110 → 01101001 +) 1 01101010 → 106 → -106 方法2) まず10進数に変換して,それを256から引いて負号をつける 10010110 → 01101001 +) 1 01101010 → 106 → -106 10010110 (正数だと思って変換) → 150 → -(256-150)= -106 2. 50 を符号反転する.50 = 32 + 16 + 2 = 00110010(2) なので, 11001101 + 1 = 11001110
  • 12. 13鏡 慎吾 (東北大学): 計算機工学 2015 (3) 符号拡張とゼロ拡張 あるビット長の2進数を,より長いビット長の2進数に変換すると き,MSB 側を符号ビットで埋める方法を符号拡張と呼ぶ.2の 補数表示の符号つき数の拡張の際に用いられる. 11111111 11111000 = –8(10) 11111111 11111111 11111111 11111000 00000000 00001000 = 8 (10) 00000000 00000000 00000000 00001000 16ビットから32ビットへの符号拡張の例: これに対して,常にゼロで埋める方法をゼロ拡張と呼ぶ.符号 なし数の拡張に用いられる. = 8 (10) = –8(10) (–8 : 「あと8 増やせば 2n になる数」)
  • 13. 14鏡 慎吾 (東北大学): 計算機工学 2015 (3) 練習問題 8ビットの符号つき数 (a) 00101100 (b) 11101101 (c) 10100101 をそれぞれ, 1) 10 進数,16進数で表せ 2) 符号を反転した数を,2の補数表示の符号つき数で表せ 3) 16ビットに符号拡張せよ 4) (a) を 3ビット右シフトし,元の数の8分の1になっている かどうか調べよ.
  • 14. 15鏡 慎吾 (東北大学): 計算機工学 2015 (3) 練習問題 解答例 1) 10進数: (a) 44 (b) – 19 (c) – 91 16進数: (a) 2c (b) ed (c) a5 2) (a) 11010100 (b) 00010011 (c) 01011011 3) (a) 00000000 00101100 (b) 11111111 11101101 (c) 11111111 10100101 4) 000000101 (44/8 の小数点以下切捨てになっている) 1) 正の数は普通に変換する.負の数は,10進にしてから 28 から引くか,符号 反転してから10進にするか.どうせ(2)で符号反転するんだから,後者の方 が楽かも. 2) ビット反転して 1 を足す. 3) MSBで拡張する. 4) 定義どおり計算.