SlideShare una empresa de Scribd logo
1 de 16
Descargar para leer sin conexión
東北大学 工学部 機械知能・航空工学科
2016年度 5セメスター・クラスC3 D1 D2 D3
計算機工学
大学院情報科学研究科
鏡 慎吾
http://www.ic.is.tohoku.ac.jp/~swk/lecture/
3. 数の表現 ― 符号つき整数
(教科書1.2節)
2鏡 慎吾 (東北大学): 計算機工学 2016 (3)
負の数の表現
素朴な方法 (符号と絶対値法)
通常我々は,10進数の絶対値の前に – をつけて負の数を表す.
同様に,最上位ビットで符号を表し,残りで絶対値を表せばよい
10111011
符号ビット:
0: 正
1: 負
絶対値
問題点:
•ゼロの表現が2通り存在する
•加減算が煩雑になる
→ 通常は,2の補数表示と呼ばれる方式が用いられる
3鏡 慎吾 (東北大学): 計算機工学 2016 (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鏡 慎吾 (東北大学): 計算機工学 2016 (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鏡 慎吾 (東北大学): 計算機工学 2016 (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鏡 慎吾 (東北大学): 計算機工学 2016 (3)
例題
ファミリーコンピュータ用ゲーム「スーパーマリオブラザーズ」(任
天堂(株), 1985年) には,「無限1up」「無限増殖」などと呼ばれる
テクニックが存在したことが知られている.すなわち,ある操作を
行うことで,プレイヤストック数 (ゲームオーバになるまでに許容さ
れるミスの回数,残機数) を際限なく増加させ続けることが可能で
あった.
一方,プレイヤストックを一定数以上に増やしすぎると,その後
たった一度のミスでゲームオーバになってしまうという現象も生じ
た.内部でどのような処理が行われていたか推測して述べよ.
例: アリアン5型ロケット打ち上げ失敗
8鏡 慎吾 (東北大学): 計算機工学 2016 (3)
• 慣性基準装置が16ビット符号つき数からのオーバフローで
エラーを起こした
• そのエラー診断番号がフライトデータだとみなされてブース
ターおよびエンジンのノズル方向が制御された
• 迎角が20度以上になり,分解,爆発した
• バックアップの慣性基準装置も同じエラーを起こしていた
J. L. Lions et al.: ARIANE 5, Flight 501 Failure, Ariane 501 Inquiry Board Report, 1996.
1996年6月4日,欧州宇宙機関が
70億ユーロをかけて開発したアリ
アン5型ロケットは,打ち上げ37秒
後に爆発した
http://www.bloomberg.com/news/photo-essays/2012-08-07/when-software-catastrophe-strikes
9鏡 慎吾 (東北大学): 計算機工学 2016 (3)
2の補数表現の符号つき数の操作
• 加減算
• 加算はそのまま計算するだけだということが分かった
• 減算は,「引く数」に負号をつけて2の補数で表し,加算を
実行すればよい: 100 – 30 = 100 + (-30)
• では,符号反転を行うには?
• 符号反転(2の補数変換)
• 「ビットを反転して1を足す」
• 2の補数表現 と 普通の10進正負の数の相互変換
10鏡 慎吾 (東北大学): 計算機工学 2016 (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)
11鏡 慎吾 (東北大学): 計算機工学 2016 (3)
10進の正負の数との変換
10進 → 2進:
• 絶対値を2進数で表現
• 正の数であれば,それで終わり
• 負の数であれば,符号反転処理
• または,絶対値を 2n から引いたものを2進数で表現
2進 → 10進:
• MSBが0か1か?
• 0であれば非負なので,そのまま10進数へ変換
• 1であれば負なので,
• 符号反転処理をしてから10進数へ変換し,負号を
つける
• または,まず10進数へ変換して,それを2nから引
いて,負号をつける
12鏡 慎吾 (東北大学): 計算機工学 2016 (3)
10進の正負の数との変換
10進 → 2進:
• 正の数であれば,そのまま2進数で表示
• 負の数であれば,
方法1) 絶対値を2進表示し,符号反転
方法2) 絶対値を 2n から引いたものを2進表示
2進 → 10進:
• MSBが0であれば非負なので,そのまま10進数へ変換
• MSBが1であれば負なので,
方法1) 符号反転処理をしてから10進数へ変換し,負号
をつける
方法2) 10進数へ変換したものを 2n から引いて,負号
をつける
13鏡 慎吾 (東北大学): 計算機工学 2016 (3)
例題
1. 10010110 (2進8ビット,2の補数表現の符号つき数) を10進
数に変換せよ
2. –50 (10進数) を 8 ビットの2の補数表現の符号つき2進数で
表せ.
14鏡 慎吾 (東北大学): 計算機工学 2016 (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. 方法1) 50 を符号反転する.50 = 32 + 16 + 2 = 00110010(2)
なので,11001101(2) + 1 = 11001110(2)
方法2) 256 – 50 = 206 = 128 + 64 + 8 + 4 + 2 = 11001110(2)
15鏡 慎吾 (東北大学): 計算機工学 2016 (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 になる数」)
16鏡 慎吾 (東北大学): 計算機工学 2016 (3)
練習問題
8ビットの符号つき数
(a) 00101100
(b) 11101101
(c) 10100101
をそれぞれ,
1) 10 進数,16進数で表せ
2) 符号を反転した数を,2の補数表示の符号つき数で表せ
3) 16ビットに符号拡張せよ
4) (a) を 3ビット右シフトし,元の数の8分の1になっている
かどうか調べよ.
17鏡 慎吾 (東北大学): 計算機工学 2016 (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) 定義どおり計算.

Más contenido relacionado

La actualidad más candente

kagami_comput2016_06
kagami_comput2016_06kagami_comput2016_06
kagami_comput2016_06swkagami
 
kagamicomput201707
kagamicomput201707kagamicomput201707
kagamicomput201707swkagami
 
kagamicomput201706
kagamicomput201706kagamicomput201706
kagamicomput201706swkagami
 
kagamicomput201704
kagamicomput201704kagamicomput201704
kagamicomput201704swkagami
 
kagami_comput2015_6
kagami_comput2015_6kagami_comput2015_6
kagami_comput2015_6swkagami
 
kagami_comput2016_04
kagami_comput2016_04kagami_comput2016_04
kagami_comput2016_04swkagami
 
kagami_comput2016_05
kagami_comput2016_05kagami_comput2016_05
kagami_comput2016_05swkagami
 
kagamicomput201710
kagamicomput201710kagamicomput201710
kagamicomput201710swkagami
 
kagami_comput2016_10
kagami_comput2016_10kagami_comput2016_10
kagami_comput2016_10swkagami
 
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806swkagami
 
kagamicomput201803
kagamicomput201803kagamicomput201803
kagamicomput201803swkagami
 
kagami_comput2016_08
kagami_comput2016_08kagami_comput2016_08
kagami_comput2016_08swkagami
 
kagamicomput201712
kagamicomput201712kagamicomput201712
kagamicomput201712swkagami
 
kagamicomput201709
kagamicomput201709kagamicomput201709
kagamicomput201709swkagami
 
kagami_comput2016_09
kagami_comput2016_09kagami_comput2016_09
kagami_comput2016_09swkagami
 
kagami_comput2015_8
kagami_comput2015_8kagami_comput2015_8
kagami_comput2015_8swkagami
 
kagamicomput201711
kagamicomput201711kagamicomput201711
kagamicomput201711swkagami
 
kagami_comput2016_11
kagami_comput2016_11kagami_comput2016_11
kagami_comput2016_11swkagami
 
kagami_comput2016_12
kagami_comput2016_12kagami_comput2016_12
kagami_comput2016_12swkagami
 

La actualidad más candente (20)

kagami_comput2016_06
kagami_comput2016_06kagami_comput2016_06
kagami_comput2016_06
 
kagamicomput201707
kagamicomput201707kagamicomput201707
kagamicomput201707
 
kagamicomput201706
kagamicomput201706kagamicomput201706
kagamicomput201706
 
kagamicomput201704
kagamicomput201704kagamicomput201704
kagamicomput201704
 
kagami_comput2015_6
kagami_comput2015_6kagami_comput2015_6
kagami_comput2015_6
 
kagami_comput2016_04
kagami_comput2016_04kagami_comput2016_04
kagami_comput2016_04
 
kagami_comput2016_05
kagami_comput2016_05kagami_comput2016_05
kagami_comput2016_05
 
kagamicomput201710
kagamicomput201710kagamicomput201710
kagamicomput201710
 
kagami_comput2016_10
kagami_comput2016_10kagami_comput2016_10
kagami_comput2016_10
 
kagamicomput201806
kagamicomput201806kagamicomput201806
kagamicomput201806
 
kagamicomput201803
kagamicomput201803kagamicomput201803
kagamicomput201803
 
kagami_comput2016_08
kagami_comput2016_08kagami_comput2016_08
kagami_comput2016_08
 
kagamicomput201712
kagamicomput201712kagamicomput201712
kagamicomput201712
 
kagamicomput201709
kagamicomput201709kagamicomput201709
kagamicomput201709
 
kagami_comput2016_09
kagami_comput2016_09kagami_comput2016_09
kagami_comput2016_09
 
kagami_comput2015_8
kagami_comput2015_8kagami_comput2015_8
kagami_comput2015_8
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
kagamicomput201711
kagamicomput201711kagamicomput201711
kagamicomput201711
 
kagami_comput2016_11
kagami_comput2016_11kagami_comput2016_11
kagami_comput2016_11
 
kagami_comput2016_12
kagami_comput2016_12kagami_comput2016_12
kagami_comput2016_12
 

Destacado

kagami_comput2015_12
kagami_comput2015_12kagami_comput2015_12
kagami_comput2015_12swkagami
 
kagami_comput2016_14
kagami_comput2016_14kagami_comput2016_14
kagami_comput2016_14swkagami
 
kagami_comput2015_13
kagami_comput2015_13kagami_comput2015_13
kagami_comput2015_13swkagami
 
kagami_comput2015_14
kagami_comput2015_14kagami_comput2015_14
kagami_comput2015_14swkagami
 
kagami_comput2015_10
kagami_comput2015_10kagami_comput2015_10
kagami_comput2015_10swkagami
 
kagami_comput2015_11
kagami_comput2015_11kagami_comput2015_11
kagami_comput2015_11swkagami
 
kagami_comput2015_9
kagami_comput2015_9kagami_comput2015_9
kagami_comput2015_9swkagami
 
kagami_comput2016_13
kagami_comput2016_13kagami_comput2016_13
kagami_comput2016_13swkagami
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4Shingo Inoue
 
HTML5クイズ!
HTML5クイズ!HTML5クイズ!
HTML5クイズ!yoshikawa_t
 
フレッシュマンセミナー20060614
フレッシュマンセミナー20060614フレッシュマンセミナー20060614
フレッシュマンセミナー20060614Takeo Kunishima
 
kagami_comput2015_4
kagami_comput2015_4kagami_comput2015_4
kagami_comput2015_4swkagami
 
JavaScript 基礎文法のまとめ
JavaScript 基礎文法のまとめJavaScript 基礎文法のまとめ
JavaScript 基礎文法のまとめYossy Taka
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
A Visys é especialista em soluções para sua Empresa! Você quer fazer a difere...
A Visys é especialista em soluções para sua Empresa! Você quer fazer a difere...A Visys é especialista em soluções para sua Empresa! Você quer fazer a difere...
A Visys é especialista em soluções para sua Empresa! Você quer fazer a difere...Sonia Fernandes Bogo
 
kagami_comput2015_7
kagami_comput2015_7kagami_comput2015_7
kagami_comput2015_7swkagami
 

Destacado (18)

kagami_comput2015_12
kagami_comput2015_12kagami_comput2015_12
kagami_comput2015_12
 
kagami_comput2016_14
kagami_comput2016_14kagami_comput2016_14
kagami_comput2016_14
 
kagami_comput2015_13
kagami_comput2015_13kagami_comput2015_13
kagami_comput2015_13
 
kagami_comput2015_14
kagami_comput2015_14kagami_comput2015_14
kagami_comput2015_14
 
kagami_comput2015_10
kagami_comput2015_10kagami_comput2015_10
kagami_comput2015_10
 
kagami_comput2015_11
kagami_comput2015_11kagami_comput2015_11
kagami_comput2015_11
 
kagami_comput2015_9
kagami_comput2015_9kagami_comput2015_9
kagami_comput2015_9
 
kagami_comput2016_13
kagami_comput2016_13kagami_comput2016_13
kagami_comput2016_13
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4
 
HTML5クイズ!
HTML5クイズ!HTML5クイズ!
HTML5クイズ!
 
フレッシュマンセミナー20060614
フレッシュマンセミナー20060614フレッシュマンセミナー20060614
フレッシュマンセミナー20060614
 
kagami_comput2015_4
kagami_comput2015_4kagami_comput2015_4
kagami_comput2015_4
 
JavaScript 基礎文法のまとめ
JavaScript 基礎文法のまとめJavaScript 基礎文法のまとめ
JavaScript 基礎文法のまとめ
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
A Visys é especialista em soluções para sua Empresa! Você quer fazer a difere...
A Visys é especialista em soluções para sua Empresa! Você quer fazer a difere...A Visys é especialista em soluções para sua Empresa! Você quer fazer a difere...
A Visys é especialista em soluções para sua Empresa! Você quer fazer a difere...
 
La vida
La vidaLa vida
La vida
 
CMSI計算科学技術特論A(3) OpenMPの基礎
CMSI計算科学技術特論A(3) OpenMPの基礎CMSI計算科学技術特論A(3) OpenMPの基礎
CMSI計算科学技術特論A(3) OpenMPの基礎
 
kagami_comput2015_7
kagami_comput2015_7kagami_comput2015_7
kagami_comput2015_7
 

Similar a kagami_comput2016_03

kagami_comput2015_3
kagami_comput2015_3kagami_comput2015_3
kagami_comput2015_3swkagami
 
コンピュータで全く使われない数表現
コンピュータで全く使われない数表現コンピュータで全く使われない数表現
コンピュータで全く使われない数表現Yu(u)ki IWABUCHI
 
足し算をつくろう
足し算をつくろう足し算をつくろう
足し算をつくろうYoichi Toyota
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Tetsuya Yoshida
 

Similar a kagami_comput2016_03 (6)

kagami_comput2015_3
kagami_comput2015_3kagami_comput2015_3
kagami_comput2015_3
 
計算機理論入門03
計算機理論入門03計算機理論入門03
計算機理論入門03
 
3 Info Theory
3 Info Theory3 Info Theory
3 Info Theory
 
コンピュータで全く使われない数表現
コンピュータで全く使われない数表現コンピュータで全く使われない数表現
コンピュータで全く使われない数表現
 
足し算をつくろう
足し算をつくろう足し算をつくろう
足し算をつくろう
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会
 

Más de swkagami

kagamicomput201814
kagamicomput201814kagamicomput201814
kagamicomput201814swkagami
 
kagamicomput201813
kagamicomput201813kagamicomput201813
kagamicomput201813swkagami
 
kagamicomput201812
kagamicomput201812kagamicomput201812
kagamicomput201812swkagami
 
kagamicomput201811
kagamicomput201811kagamicomput201811
kagamicomput201811swkagami
 
kagamicomput201810
kagamicomput201810kagamicomput201810
kagamicomput201810swkagami
 
kagamicomput201809
kagamicomput201809kagamicomput201809
kagamicomput201809swkagami
 
kagamicomput201808
kagamicomput201808kagamicomput201808
kagamicomput201808swkagami
 
kagamicomput201807
kagamicomput201807kagamicomput201807
kagamicomput201807swkagami
 
kagamicomput201805
kagamicomput201805kagamicomput201805
kagamicomput201805swkagami
 
kagamicomput201804
kagamicomput201804kagamicomput201804
kagamicomput201804swkagami
 
kagamicomput201801
kagamicomput201801kagamicomput201801
kagamicomput201801swkagami
 
kagamicomput201714
kagamicomput201714kagamicomput201714
kagamicomput201714swkagami
 
kagamicomput201713
kagamicomput201713kagamicomput201713
kagamicomput201713swkagami
 
kagamicomput201708
kagamicomput201708kagamicomput201708
kagamicomput201708swkagami
 
kagamicomput201705
kagamicomput201705kagamicomput201705
kagamicomput201705swkagami
 

Más de swkagami (15)

kagamicomput201814
kagamicomput201814kagamicomput201814
kagamicomput201814
 
kagamicomput201813
kagamicomput201813kagamicomput201813
kagamicomput201813
 
kagamicomput201812
kagamicomput201812kagamicomput201812
kagamicomput201812
 
kagamicomput201811
kagamicomput201811kagamicomput201811
kagamicomput201811
 
kagamicomput201810
kagamicomput201810kagamicomput201810
kagamicomput201810
 
kagamicomput201809
kagamicomput201809kagamicomput201809
kagamicomput201809
 
kagamicomput201808
kagamicomput201808kagamicomput201808
kagamicomput201808
 
kagamicomput201807
kagamicomput201807kagamicomput201807
kagamicomput201807
 
kagamicomput201805
kagamicomput201805kagamicomput201805
kagamicomput201805
 
kagamicomput201804
kagamicomput201804kagamicomput201804
kagamicomput201804
 
kagamicomput201801
kagamicomput201801kagamicomput201801
kagamicomput201801
 
kagamicomput201714
kagamicomput201714kagamicomput201714
kagamicomput201714
 
kagamicomput201713
kagamicomput201713kagamicomput201713
kagamicomput201713
 
kagamicomput201708
kagamicomput201708kagamicomput201708
kagamicomput201708
 
kagamicomput201705
kagamicomput201705kagamicomput201705
kagamicomput201705
 

kagami_comput2016_03

  • 1. 東北大学 工学部 機械知能・航空工学科 2016年度 5セメスター・クラスC3 D1 D2 D3 計算機工学 大学院情報科学研究科 鏡 慎吾 http://www.ic.is.tohoku.ac.jp/~swk/lecture/ 3. 数の表現 ― 符号つき整数 (教科書1.2節)
  • 2. 2鏡 慎吾 (東北大学): 計算機工学 2016 (3) 負の数の表現 素朴な方法 (符号と絶対値法) 通常我々は,10進数の絶対値の前に – をつけて負の数を表す. 同様に,最上位ビットで符号を表し,残りで絶対値を表せばよい 10111011 符号ビット: 0: 正 1: 負 絶対値 問題点: •ゼロの表現が2通り存在する •加減算が煩雑になる → 通常は,2の補数表示と呼ばれる方式が用いられる
  • 3. 3鏡 慎吾 (東北大学): 計算機工学 2016 (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鏡 慎吾 (東北大学): 計算機工学 2016 (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鏡 慎吾 (東北大学): 計算機工学 2016 (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鏡 慎吾 (東北大学): 計算機工学 2016 (3) 例題 ファミリーコンピュータ用ゲーム「スーパーマリオブラザーズ」(任 天堂(株), 1985年) には,「無限1up」「無限増殖」などと呼ばれる テクニックが存在したことが知られている.すなわち,ある操作を 行うことで,プレイヤストック数 (ゲームオーバになるまでに許容さ れるミスの回数,残機数) を際限なく増加させ続けることが可能で あった. 一方,プレイヤストックを一定数以上に増やしすぎると,その後 たった一度のミスでゲームオーバになってしまうという現象も生じ た.内部でどのような処理が行われていたか推測して述べよ.
  • 7. 例: アリアン5型ロケット打ち上げ失敗 8鏡 慎吾 (東北大学): 計算機工学 2016 (3) • 慣性基準装置が16ビット符号つき数からのオーバフローで エラーを起こした • そのエラー診断番号がフライトデータだとみなされてブース ターおよびエンジンのノズル方向が制御された • 迎角が20度以上になり,分解,爆発した • バックアップの慣性基準装置も同じエラーを起こしていた J. L. Lions et al.: ARIANE 5, Flight 501 Failure, Ariane 501 Inquiry Board Report, 1996. 1996年6月4日,欧州宇宙機関が 70億ユーロをかけて開発したアリ アン5型ロケットは,打ち上げ37秒 後に爆発した http://www.bloomberg.com/news/photo-essays/2012-08-07/when-software-catastrophe-strikes
  • 8. 9鏡 慎吾 (東北大学): 計算機工学 2016 (3) 2の補数表現の符号つき数の操作 • 加減算 • 加算はそのまま計算するだけだということが分かった • 減算は,「引く数」に負号をつけて2の補数で表し,加算を 実行すればよい: 100 – 30 = 100 + (-30) • では,符号反転を行うには? • 符号反転(2の補数変換) • 「ビットを反転して1を足す」 • 2の補数表現 と 普通の10進正負の数の相互変換
  • 9. 10鏡 慎吾 (東北大学): 計算機工学 2016 (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. 11鏡 慎吾 (東北大学): 計算機工学 2016 (3) 10進の正負の数との変換 10進 → 2進: • 絶対値を2進数で表現 • 正の数であれば,それで終わり • 負の数であれば,符号反転処理 • または,絶対値を 2n から引いたものを2進数で表現 2進 → 10進: • MSBが0か1か? • 0であれば非負なので,そのまま10進数へ変換 • 1であれば負なので, • 符号反転処理をしてから10進数へ変換し,負号を つける • または,まず10進数へ変換して,それを2nから引 いて,負号をつける
  • 11. 12鏡 慎吾 (東北大学): 計算機工学 2016 (3) 10進の正負の数との変換 10進 → 2進: • 正の数であれば,そのまま2進数で表示 • 負の数であれば, 方法1) 絶対値を2進表示し,符号反転 方法2) 絶対値を 2n から引いたものを2進表示 2進 → 10進: • MSBが0であれば非負なので,そのまま10進数へ変換 • MSBが1であれば負なので, 方法1) 符号反転処理をしてから10進数へ変換し,負号 をつける 方法2) 10進数へ変換したものを 2n から引いて,負号 をつける
  • 12. 13鏡 慎吾 (東北大学): 計算機工学 2016 (3) 例題 1. 10010110 (2進8ビット,2の補数表現の符号つき数) を10進 数に変換せよ 2. –50 (10進数) を 8 ビットの2の補数表現の符号つき2進数で 表せ.
  • 13. 14鏡 慎吾 (東北大学): 計算機工学 2016 (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. 方法1) 50 を符号反転する.50 = 32 + 16 + 2 = 00110010(2) なので,11001101(2) + 1 = 11001110(2) 方法2) 256 – 50 = 206 = 128 + 64 + 8 + 4 + 2 = 11001110(2)
  • 14. 15鏡 慎吾 (東北大学): 計算機工学 2016 (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 になる数」)
  • 15. 16鏡 慎吾 (東北大学): 計算機工学 2016 (3) 練習問題 8ビットの符号つき数 (a) 00101100 (b) 11101101 (c) 10100101 をそれぞれ, 1) 10 進数,16進数で表せ 2) 符号を反転した数を,2の補数表示の符号つき数で表せ 3) 16ビットに符号拡張せよ 4) (a) を 3ビット右シフトし,元の数の8分の1になっている かどうか調べよ.
  • 16. 17鏡 慎吾 (東北大学): 計算機工学 2016 (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) 定義どおり計算.