---
title: ca-9. 数の扱い
tags:  #浮動小数点数 #アセンブリ言語 #２の補数 #算術シフト #論理シフト  
author: [kunihikokaneko](https://www.docswell.com/user/6674398749)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/W4JZL1D6E3.jpg?width=480
description: コンピュータ・アーキテクチャ演習 URL: https://www.kkaneko.jp/cc/ca/index.html
published: December 23, 21
canonical: https://www.docswell.com/s/6674398749/ZJX1Q5-2021-12-23-135006
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/W4JZL1D6E3.jpg)

ca-9. 数の扱い
（コンピュータ・アーキテクチャ演習）
URL: https://www.kkaneko.jp/cc/ca/index.html
金子邦彦
1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/KYE6WL1LEV.jpg)

アウトライン
9-1 浮動小数点数の扱い
9-2 ２の補数
9-3 算術シフト
9-4 論理シフト
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/5GE5M14ME4.jpg)

9-1 浮動小数点数の扱い
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/V97291VRJR.jpg)

対応
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/5DJY4Z357M.jpg)

対応
使用されるレジスタが
xmm0 に変わるなど，
いくつかの変化
int を double に変更
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/2V7NY3V4E8.jpg)

9-4 ２の補数
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/GYJ9P96473.jpg)

２の補数
• ２の補数は，負の整数も扱いたいときに便利
• ２の補数では，最上位ビットが符号ビット
０
→
正の整数または０
１
→
負の整数
10進数の２
0
0
0
0
0
0
1
0
10進数の１
0
0
0
0
0
0
0
1
10進数の０
0
0
0
0
0
0
0
0
10進数の－１ 1
1
1
1
1
1
1
1
10進数の－２ 1
1
1
1
1
1
1
0
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/5GJ8D9ZVJD.jpg)

２の補数での符号ビット
８ビットの整数データの場合
8
7
6
5
4
3
2
1
２の補数では，最上位ビットは符号ビット
０
→ 正の数，０
１
→ 負の数
正なのか負なのかの区別に使う
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/MLJLMWDRER.jpg)

演習
① ウェブブラウザを起動する
② python tutor を使いたいので，次の URL を開く
http://www.pythontutor.com/
※ Internet Explorer でうまく動かない場合があり
ます
→ うまく動かないときは Google Chrome を試し
てください
※ 日本語モードはないので，英語で使う
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/547MY9PP7W.jpg)

③ 「Visualize your code and live help now」をク
リック
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/ZP7R9G1YE9.jpg)

言語を選べる．
「Python 3.6」を選んでおく
エディタ
実行のためのボタン
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/NPJXQXY47X.jpg)

① 次のように書きなさい
print( format( -2 &amp; 0xff, &#039;b&#039; ) )
print( format( -1 &amp; 0xff, &#039;b&#039; ) )
print( format( 0 &amp; 0xff, &#039;b&#039; ) )
print( format( 1 &amp; 0xff, &#039;b&#039; ) )
print( format( 2 &amp; 0xff, &#039;b&#039; ) )
print( format( 3 &amp; 0xff, &#039;b&#039; ) )
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/63JK9W3PJD.jpg)

②「Visualize Execution」をクリック
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/4LE3W1G4E5.jpg)

③「Last」ボタンをクリック
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/V8EDKX157G.jpg)

④
結果を確認
-2
-1
0
1
2
3
10進数
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/4V7PKPQDJ8.jpg)

9-3 算術シフト
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/L2JVV25GJQ.jpg)

算術シフト
整数を２倍したい，４倍したい，１／２倍したい，
１／４倍したい
数
１０（十進数）
0 0 0 0 1 0 1 0 （二進数）
ここでは，
最上位ビットは
符号ビット
（+か－かの記録）
0
２０（十進数）
0 0 0 1 0 1 0 0 （二進数）
整数の２倍 ＝ 最上位ビット以外のビットを左に１つ
ずらす（左シフト）
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/Z5EGLRPDJL.jpg)

算術シフトの左と右
• 算術左シフト
• 最上位ビットは変化しない
• 最上位ビット以外を左にシフト．できた空きに
は０を詰める
• 算術右シフト
• 最上位ビットは変化しない
• 最上位ビット以外を右にシフト．できた空きに
は最上位ビットの値を詰める
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/V4JQYV2X7P.jpg)

算術左シフトによる２倍
１０（十進数）
0 0 0 0 1 0 1 0 （二進数）
0
２０（十進数）
0 0 0 1 0 1 0 0 （二進数）
－５（十進数）
1 1 1 1 1 0 1 1 （二進数） ※ ２の補数
0
－１０（十進数） 1 1 1 1 0 1 1 0 （二進数）※
２の補数
最上位ビット以外を左に１つずらす（左シフ
ト）．
最下位ビットに０を入れる
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/DK74WML2E1.jpg)

算術左シフトによる４倍
１０（十進数）
0 0 0 0 1 0 1 0 （二進数）
00
４０（十進数）
0 0 1 0 1 0 0 0 （二進数）
－５（十進数）
1 1 1 1 1 0 1 1 （二進数） ※ ２の補数
00
－２０（十進数） 1 1 1 0 1 1 0 0 （二進数）※ ２の補数
最上位ビット以外を左に2つずらす（左シフ
ト）．
最下位2つに，「０0」を入れる
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/PLJ1Y8LKEG.jpg)

算術右シフトによる １／２倍
１０（十進数）
0 0 0 0 1 0 1 0 （二進数）
５（十進数）
0 0 0 0 0 1 0 1 （二進数）
－５（十進数）
1 1 1 1 1 0 1 1 （二進数） ※ ２の補数
－３（十進数）
1 1 1 1 1 1 0 1 （二進数）※
２の補数
最上位ビット以外を右に１つずらす（右シフ
ト）．
最上位から２番目のビットには，最上位ビッ
トを入れる
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/8GJWGZVP72.jpg)

算術シフト
• 整数を２倍，４倍，・・・，１／２倍，
１／４倍・・・，したいときに使う
• ２の補数では，符号ビットがある．符号
ビットの部分はそのまま残すのが，算術
シフト
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/W4EZL14673.jpg)

算術右シフト sar の例
算術右シフトは 1/2倍, 1/4倍, ・・・
アセンブリ言語のプログラム
a に 32 をセット
a を 2ビット算術右シフト
実行結果の例
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/KY76WL3L7V.jpg)

算術左シフト sal の例
算術左シフトは 2倍, 4倍, ・・・
アセンブリ言語のプログラム
a に 32 をセット
a を 2ビット算術左シフト
実行結果の例
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/5G75M1LM74.jpg)

演習
• Visual Studio を起動しなさい
• Visual Studio で，Win32 コンソールアプリケー
ション用プロジェクトを新規作成しなさい
プロジェクトの「名前」は何でもよい
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/V9J291LRER.jpg)

• Visual Studioのエディタを使って，ソースファイ
ルを編集しなさい
追加
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/5DEY4ZQ5JM.jpg)

• ビルドしなさい．ビルドのあと「１
０ 失敗」の表示を確認しなさい
正常終了，
→ 表示されなければ，プログラムのミスを自分で
確認し，修正して，ビルドをやり直す
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/2VJNY3K478.jpg)

• Visual Studioで，ブレークポイントを設定しなさ
い
• Visual Studioで，デバッガーを起動しなさい．
「デバッグ」
→ 「デバッグ開始」
• ブレークポイントの行で，実行が中断することを確認し
なさい
あとで使うので，中断したままにしておくこと
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/GYE9P9V4J3.jpg)

• 逆アセンブルで「a = a / 2」のところを確認しな
さい．
idiv ではなく sar になっている（算術シフト）
1ビットのシフト
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/5GE8D9PVED.jpg)

• 次のように書き替えて，同じ手順を繰り返しなさ
い.
逆アセンブルで「a = a / 4」のところを確認しなさ
い．
2ビットのシフト
30


# Page. 31

![Page Image](https://bcdn.docswell.com/page/MLELMW1R7R.jpg)

• 次のように書き替えて，今度は，変数 a の値を確
認しなさい
３ビットのシフト
（８で割って，あまりを切り捨て）
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/54JMY9WPJW.jpg)

• 次のように書き替えて， 変数 a の値を確認しな
さい
３ビットのシフト
（８倍）
32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/ZPJR9GYY79.jpg)

Pentium 系列プロセッサの
算術演算命令の例
種類
算術演算
命令
意味
add
加算
sub
減算
imul
乗算
idiv
除算
sar, sal
算術シフト
33


# Page. 34

![Page Image](https://bcdn.docswell.com/page/NPEXQXG4JX.jpg)

9-4 論理シフト
34


# Page. 35

![Page Image](https://bcdn.docswell.com/page/63EK9W4PED.jpg)

論理シフトの例
２ビット目が１か０かを調べたい
他のビットは無視したい
10001010
論理右シフト
0
01000101
00000001
論理積
00000001
※ もし，元の２ビット目が０だったときは，
この値は「００００００００」
35


