%=====================================================================
% 秋田高専 3E 電子計算機 テキスト
%　　テーマ　構造体
%    本テキストの内容
%        ・
%        ・
%        ・
%        ・
%　　　 　・
%
% last updated 2005.10.20
%    created by  Masashi Yamamoto
%     e-mail yamamoto@akita-nct.jp
%=====================================================================
\documentclass[10pt,a4paper]{jarticle}
\usepackage{html,graphicx,amsmath,amssymb,ascmac,float}
\usepackage{multicol}
\oddsidemargin 0mm  %左の余白 25.4mm-0mm　奇数ページ
\evensidemargin 0mm %左の余白 25.4mm-0mm　偶数ページ
\textwidth 160mm
\newcommand{\diff}[0]{\mathrm{d}}
\newcommand{\command}[1]{「\texttt{#1}」}
\newcommand{\cl}[1]{\texttt{#1}}
\newcommand{\tw}[1]{\texttt{#1}}
%
% 自動的に番号を振るマクロ
% http://www.interq.or.jp/mars/cherry/tex/counter.html
%
\newcounter{nombre}
\renewcommand{\thenombre}{\arabic{nombre}}
\setcounter{nombre}{0}
\newcounter{nombresub}[nombre] %親子関係を定義
\renewcommand{\thenombresub}{\arabic{nombresub}}
\setcounter{nombresub}{0}
\newcommand{\prob}[1][]{\refstepcounter{nombre}#1［問題 \thenombre］}
\newcommand{\probsub}[1][]{\refstepcounter{nombresub}#1(\thenombresub)}
%
\newcounter{toi_num}
\newcommand{\toi}{\textbf{\texttt [問\arabic{toi_num}]}
   \addtocounter{toi_num}{1}}
%
\begin{document}
\title{COMET IIのメモリーと負の整数の表現}
\author{山本昌志\thanks{独立行政法人　秋田工業高等専門学校　電気工学科}}
\date{2005年11月4日}
\maketitle
%
%
%=====================================================================
\section{本日の学習内容}
%=====================================================================
本日の講義内容は以下の通りで，教科書のp.9〜12に対応する．
%
\begin{itemize}
 \item{COMET IIの取り扱う数値}
      \begin{itemize}
       \item 情報の単位
       \item COMET IIのメモリー
       \item 整数表現とその最大値と最小値
       \item Pentiumのメモリー
      \end{itemize}
 \item{負の数の表現方法}
      \begin{itemize}
       \item 符号ビットを用いる方法(絶対値表示)
       \item 2の補数
      \end{itemize}
\end{itemize}
%
%=====================================================================
\section{コメットIIのメモリー}
%=====================================================================
%---------------------------------------------------------------------
\subsection{情報の単位}
%---------------------------------------------------------------------
情報の単位はビット(bit\footnote{binary unitの略})と言う．1ビットは，"0"か"1"か，
"yes"か"no"かのように，2種類の情報を分けることができる\footnote{2つの
場合に分けることができる情報があると言った方がよいかも．}．"yes"か"no"とかのように
表現すると後の計算が面倒なので，今後はすべて"0"か"1"の記号を用いることにする．よ
うするに，"0"か"1"のいずれかが生じる事象\footnote{正確に言うと，"0"と"1"は同じ確
率で生じる必要がある．ここでは，そんなことは気にしないことにする．}で，"0"または
"1"を得たとき，1ビットの情報を得たという．

それでは，2ビットとはどういう情報であろうか?．それは，"00"か"01"か"10"か"11"のよ
うに4つの事象があるとき，それらのいずれかを受け取ったとき，2ビットの情報を受け取った
ことになる．同様に，"0と1がn個"あるような事象がある時に，それらの一つの事象を知
らされた場合，nビットの情報を受け取ったことになる． 

これまでの話から，2進数の桁数がビット数になることが分かる．n桁の2進数はnビットの
情報を表すことが可能で，それは2$^n$個の事象を分けることができる．$k$個の事象を分
けるために$x$ビット必要となると，
\begin{align}
 x=\log_2 k
\end{align}
の関係がある．

    \paragraph{[練習問題]}秋田高専の学生数を800人とすると，一人一人を区別するために，
    必要な情報量をビット数で答えよ．さらに，2進数で表現すると何桁必要か?．
    
    \paragraph{[解答]}ビット数は，
    \begin{align*}
     \log_2 800=9.64\cdots
    \end{align*}
    である．2進数で表現すると，10桁必要となる．

\begin{screen}
 \begin{itemize}
  \item 情報の単位は，ビットが用いられる．それは，"0"か"1"の2つの事象の1つの状態
	を表す．
  \item 2進数の桁数がビット数である．
  \item 16進数の1桁は2進数の4桁なので，16進数の1桁は4ビット，2桁は8ビットである．
  \item $k$個の事象があるとき，それの一つの情報を得るためには，$\log_2 k$ビット
	必要である．
 \end{itemize}
\end{screen}
%
%---------------------------------------------------------------------
\subsection{COMET IIのメモリー}
%---------------------------------------------------------------------
アセンブラ言語CASL IIが動作するコンピューターをCOMET IIという．これにはCPUとメモ
リーがある．第1回の講義で述べたように，メモリーにはアドレスとデータの内容がある．
このCOMET IIのメインメモリー(主記憶装置)は，図\ref{fig:memory_binary}に示すとお
り，アドレス16ビット，メモリー16ビットとなっている．
%
\begin{itemize}
 \item{アドレスが16ビット，メモリーが16ビットになっている．}
 \item{アドレス1個あたり，1個のデータがある．}
\end{itemize}
%

この図を見ても分かるように，2進数表示は紙面の面積が必要で紙の無駄である．もう少
し紙を節約し，更に分かりやすくするために，通常は図\ref{fig:memory_hexadecimal}の
16進数表示が使わる．

COMET IIでは，データは16ビット単位で扱われる．この16ビットの単位を1
ワード(1語)と呼ぶ．この1ワードは，教科書に書かれているように，便宜
上，上位8ビットと下位8ビットに分けられる．そうして，最下位のビットか
ら番号がつけられている．最下位のビット番号が0で，最上位が15である．コ
ンピューターの世界では，整数は0から数えることが多いので，それに慣れる必要がある．こうすると便利なことは，整数を表す場合，ビット番号が2進数の指
数を表す．すなわち，第0ビットは$2^0$，第7ビットは$2^7$，第15ビット
は$2^{15}$の桁を表すのである．まことに便利である．
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.8]{figure/memory_binary.eps}
  \caption{メモリーのモデル(2進数表示)}
  \label{fig:memory_binary}
 \end{center}
\end{figure}
%
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.8]{figure/memory_hexadecimal.eps}
  \caption{メモリーのモデル(16進数表示)}
  \label{fig:memory_hexadecimal}
 \end{center}
\end{figure}
%
%---------------------------------------------------------------------
\subsection{整数表現とその最大値と最小値}
%---------------------------------------------------------------------
CASL IIのプログラムではよほどのことが無い限り，整数しか取り扱わない．ひとつの整
数は，メモリーのひとつのアドレスに格納される．符号無し整数の場合，2進数で表現し
た整数がそのまま，メモリー上のデータとなる．メモリーに格納された整数の様子を図
\ref{fig:memory_integer}に示す．ただし，符号付整数か，符号無し整数かの判別は，プ
ログラム次第である．符号付きの整数については，次の章で示す．

その整数の範囲については，教科書の通りである．電卓で自分で確認してみよう．
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.8]{figure/memory_integer.eps}
  \caption{整数を格納しているメモリーの状態(16進数表示)}
  \label{fig:memory_integer}
 \end{center}
\end{figure}
%
%---------------------------------------------------------------------
\subsection{Pentiumのメモリー}
%---------------------------------------------------------------------
COMET IIのメモリーは先ほど述べたとおりである．皆さんが使っているIntelのPentiumの
メモリーはどうなっているのだろうか?．まず，アドレスバスは32 ビットである．通常の
コンピューターのデータは，8ビット単位で扱われ，その単位を1 Byteと言う．一つのア
ドレスに1 Byte(8 bits)のデータが格納されている．Pentium のアドレスバスは32ビット
ので，それが取り扱うことができるデータ数は，$2^{32}$である．$2^{30}$でG(ギガ)
\footnote{コンピューターの世界の補助単位は，$2^{10}$でk(キロ)，$2^{20}$でk(メガ)，
$2^{30}$でG(ギガ) となる．}なので，4 GBytesのデータを扱うことができる．

また，データバスは64 bitsで，レジスター\footnote{CPUの中の記憶装置}は32 bitsであ
る．一度に32 bitsのデータを取り扱うことができるから，32bit CPUと呼ばれている．こ
こで，ひとつ疑問が生じる．1つのアドレスには8 bitsのデータしか格納されないのに，
64 bitsのデータを一度に取り扱うのは変と感じる．どうやっているかというと，pentium 
では一度に8個のアドレスのデータを読み書きできるのである．

ひとつのアドレスに，64 bitsを格納できるようにすれば，問題がなくなるように考えら
れる．そうすると他の問題が生じる．今まで，8 bits単位でデータを取り扱ってきたので，
過去のデータやソフトウェアーとの互換性がなくなる可能性がある．

実際のコンピューターで使われるメモリーは，RAM(Random Access Memory)である．1ビッ
トのデータは，RAMの内部のコンデンサー\footnote{DRAM (Dynamic Random Access
Memory)は、1個のトランジスターとコンデンサーで1ビットを蓄える。}に電荷が有れば1
に、無ければ0になる。いったい、メモリー1枚にどれほどのコンデンサーがあるのだろう
か?。
%
\begin{itemize}
 \item{近頃の市販の1枚のRAMは、512 MBytesである。}
 \item{1 Byteは8ビットなので、1 Byteあたり8個のコンデンサーがある。}
 \item{512 MBytes=2$^{29}$ Byteである。}
\end{itemize}
%
以上のことから、512 MBytesのRAMの中に、$2^{32}=4294967296$のコンデンサーがある。
約43億個である。非常に驚かされる。これが、1個の間違いも無く動く、どうなっている
のだろうか?
%
%
%=====================================================================
\section{負の整数の表現}
%=====================================================================
コンピューター内部で負の整数を表現する方法はいろいろ考えられる．ここでは，2通りの
方法を示すが，符号ビットを用いる方法は現在では使われていないので，忘れてしまって
も良い．諸君は，2の補数を用いる方法を理解しなくてはならない．
%---------------------------------------------------------------------
\subsection{符号ビットを用いる方法(絶対値表示)}
%---------------------------------------------------------------------
これまでは，正の整数を2進数あるいは16進数で表現することを学習した．次に，負の整
数を表す方法を学習する．通常の負の数は，
\begin{align*}
(-0100110011101111)_2=(-4CEF)_{16}=(-19695)_{10}
\end{align*}
と，マイナスの記号を書く．コンピューターでこれを表現するためには，符号ビットとし
て，1ビット用意すれば良い．たとえば，先頭のビットが1の場合，それはマイナスを表す
とする．例えば，$(-19695)_{10}$は，コンピューター内部で\tw{1100110011101111}と
表すのである．

これは良い方法のように思える．しかし，\tw{1000000000000000}と
\tw{0000000000000000}が同じゼロを表すことになる．明らかに不便である．また，詳し
くは述べないが，これを使った負の数の演算のためのハードウェアー(CPU)が複雑になり，
現代ではこの方法は使われていない．実際には，次に述べる2の補数を使って，コンピュー
ター内部では，負の数を表すのである．
%
%---------------------------------------------------------------------
\subsection{2の補数}
%---------------------------------------------------------------------
%------------------------
\subsubsection{理論的な話}
%------------------------
負の整数は，補数(complement)を使って，コンピューター内部では表現される．それを図
\ref{fig:complement}に示すが，手順は，次の通りである．
\begin{enumerate}
 \item 絶対値を2進数のビットパターンで表現し，その反転を行う．
 \item 反転されたビットパターンに1を加算する．
\end{enumerate}
このようにしてできたビットパターンをメモリーに記憶させ，それを負の数として取り扱
う．
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]
  {figure/complement.eps}
  \caption{負の整数をメモリーに格納する方法}
  \label{fig:complement}
 \end{center}
\end{figure}

2の補数表現のイメージは，図\ref{fig:image_complement}の通りである．車の距離計に
似ている．

\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]
  {figure/image_complement.eps}
  \caption{距離計イメージ(2の補数表示)}
  \label{fig:image_complement}
 \end{center}
\end{figure}
%

2の補数を使うメリットは，減算が加算器で可能なことである．それでは，なぜ，補数表
現だと，減算が加算器で可能なのだろうか?．減算の演算は，負の数の加算と同じである．
したがって，図\ref{fig:image_complement}のように負の数を表現すると，負の整数の加
算は正の整数の加算と同じと分かるであろう．したがって，加算器で減算が可能となる．
実際，正の数の減算を行うときは，ビットの反転と+1加算を実施して，加算器で計算する．
イメージは，図\ref{fig:image_complement}の通りであるが，もう少し，理論的に説明を
おこなうとしよう．ある正の整数をxとする．その負の数，$-x$ は補数表現では，
\begin{align}
[-x]=(FFFF-x+1)_{16}
\end{align}
となる．左辺の$[-x]$が$-x$の意味である．$[\quad]$の意味は，括弧内の負の整数を計
算機内部の表現を表している．これは，私が作った表記なので，一般には用いられていな
い．右辺の$FFFF-x$がビット反転になっている．ここでは，16ビットで整数を表現しよう
としているので，$FFFF$から$x$を引いてビット反転させている．疑問に思う者は実際に
計算して見よ．それに1を加えて，補数の表現としている．つぎに，ある整数$y$を考えて，
y-xを計算してみよう．
\begin{align}
 [y-x]=(y+FFFF-x+1)_{16}
 \label{eq:kasann_hosuu}
\end{align}
$FFFF-x+1$は，あらかじめ計算されて，コンピューター内部のメモリーに格納されている
ので，$[y-x]$は加算器で可能である．これは，あたりまえである．重要なことは，この結
果が，負の場合，2の補数表現になっており，正の場合，そのままの値になっていること
である．

演算の結果，y-xが負になる場合を考えよう．すると式(\ref{eq:kasann_hosuu})は，
\begin{align}
 [y-x]=\left\{FFFF-(x-y)+1)\right\}_{16}
\end{align}
と変形できる．この場合，絶対値が $(x-y)$ なので，絶対値のビット反転と+1加算となっ
ていることが理解できる．つぎに，$y-x$が正になる場合を考えましょう．すると式(\ref{eq:kasann_hosuu})は，
\begin{align}
 [y-x]&=(y-x+FFFF+1)_{16} \nonumber \\
 &=(y-x+10000)_{16}
\end{align}
となる．$(10000)_{16}$は計算機内部では，桁上がりを示す．16ビットの表示では無視される．し
たがって，内部の表現は，正しく表せる．

\begin{itembox}[l]{コーヒーブレイク}
この方法で負の数を表すことは，1970年頃には常識となったようです．驚いたことに，負
の数をこの補数で表すアイディアは，パスカルが最初です．パスカルは，パスカリーヌと
いう歯車式計算機を1642年頃に製作しています．そこの減算を加算器で行うために，補数
というものを考えたようです．
\end{itembox}
%
%------------------------------------
\subsubsection{ビット反転と+1加算の意味}
%------------------------------------
$x$を正の整数として，$-x$をコンピューターの内部で表現する場合，
\begin{enumerate}
 \item $x$をビット反転する．
 \item +1加算する．
\end{enumerate}
の操作で得られたものその内部表現になる．式で表すと，
\begin{align}
 [-x]=(FFFF-x+1)_{16}
 \label{eq:x_inverse}
\end{align}
である．この操作の意味を調べてみよう．結論から言
うと，この操作は符号反転(-1乗算)の操作になっている．それを示すために，もう一度こ
の操作を繰り返してみる．すると，
\begin{align}
 \left\{FFFF-(FFFF-x+1)+1\right\}_{16}&=(x)_{16}\nonumber\\
 &=[x]
 \label{eq:minus_x_inverse}
\end{align}
となる．このことから，この操作は，符号反転であることが理解できる．式
(\ref{eq:x_inverse})は，$x$の符号反転を示しており，式(\ref{eq:minus_x_inverse})
は$-x$の符号反転を示している．

式(\ref{eq:x_inverse})は，-xのコンピューターの内部表現を表している．従って，元の
xを求めるためには，その逆の操作
\begin{enumerate}
 \item 1減算(-1加算)する．
 \item ビット反転する．
\end{enumerate}
をすればよく，式だと
\begin{align}
 \left[FFFF-\left\{(FFFF-x+1)-1\right\}\right]&=(x)_{16}\nonumber\\
 &=[x]
 \label{eq:hosu_gyaku}
\end{align}
となる．しかし，元の表現を得るためには，式(\ref{eq:minus_x_inverse})の演算でも良
いはずである．式(\ref{eq:hosu_gyaku})を変形すると，容易に式
(\ref{eq:minus_x_inverse})を導くことができる．これらのことから，以下の結論を導く
ことができる．
\begin{itemize}
 \item ビット反転と+1加算の操作は，整数のコンピューターの内部での表現の符号反転で
       ある．
 \item この符号反転の反対の操作である1減算とビット反転の操作は，ビット反転と1加
       算と同じ操作である．
\end{itemize}
%
%-----------------------------------------------
\subsubsection{2の補数表現と10進数の通常の表現の変換}
%-----------------------------------------------
これは，教科書に書いてあるとおり．
%
%=====================================================================
\section{実数の表現}
%=====================================================================
CASL IIでは，実数を取り扱わない．そのため，ここでは実数の表現方法について，学習
しないことにする．しかし，実際のコンピューターでは実数が使われているので，その方
法につては，付録に示しておく．興味のある者は，読んでみるとよい．さらに，実際にプ
ログラムを作成して，調べてみると良い．
%
\newpage
%=====================================================================
\section{課題(レポート)}
%=====================================================================
%---------------------------------------------------------------------
\subsection{情報量}
%---------------------------------------------------------------------
\setcounter{toi_num}{1}
\begin{quote}
 \begin{itemize}
  \item[\toi] ある特定の人間の性別を表す場合に，必要なビット数を答えよ．
  \item[\toi] 秋田高専の学生の生年月日を記述したい．一人あたりの必要なビット数を
	      考えよ．
  \item[\toi] 640$\times$400ピクセルのカラー写真の場合，どれくらいのビット数が必
	      要か調べよ．
 \end{itemize}
\end{quote}
%---------------------------------------------------------------------
\subsection{符号無し整数}
%---------------------------------------------------------------------
プログラマーが次のように，符号無し整数を格納した．CMOET IIのメモリーの内容を図
\ref{fig:memory_plus_integer}に記述せよ．2進数と16進数で記述すること．

%
\begin{itemize}
 \item{アドレスの\texttt{B000}から，符号無しの整数(10進数)で
      (1,\,2,\,4,\,8,\,16,\,25,\,100,\,511,\,32768,\,65535)を格納した．以
      下のヒントを利用せよ．}
 \begin{itemize}
  \item[]{$(32768)_{10}=(2^{15})_{10}$}
  \item[]{$(65535)_{10}=(2^{16}-1)_{10}$}
 \end{itemize}
\end{itemize}
%
\begin{figure}[h]
 \begin{center}
  \begin{tabular}{cp{5mm}||c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c||p{5mm}c}
  \multicolumn{1}{c}{アドレス} & \multicolumn{1}{c}{  } &
  \multicolumn{16}{c}{データ}  & \multicolumn{1}{c}{  } &
  \multicolumn{1}{c}{データ} \\
  \multicolumn{1}{c}{(16進数)} & \multicolumn{1}{c}{  } &
  \multicolumn{16}{c}{(2進数)}   & \multicolumn{1}{c}{  } &
  \multicolumn{1}{c}{(16進数)} \\
   %
   \texttt{AFFF} & &
   1&0&0&1&1&1&1&1&0&1&0&1&1&0&1&0& & 
   \texttt{9F5A} \\ \hline
   %
   \texttt{B000} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B001} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B002} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B003} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B004} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B005} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B006} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B007} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B008} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B009} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B00A} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
  \end{tabular}
  \caption{符号無し整数を格納したときのメモリーの内容}
  \label{fig:memory_plus_integer}
 \end{center}
\end{figure}
%
\newpage
%---------------------------------------------------------------------
\subsection{符号付整数整数}
%---------------------------------------------------------------------
次のように，符号無し整数を格納した．CMOET IIのメモリーの内容を図
\ref{fig:memory_minus_integer}に記述せよ．2進数と16進数で記述すること．
%
\begin{itemize}
 \item{アドレスの\texttt{B000}から，符号有りの整数(10進数)で
      (-1,\,-2,\,-4,\,-8,\,-16,\,-25,\,-100,\,-511,\,-32768,\,517,\,32767)
      を格納した．以下のヒントを利用せよ．}
      \begin{itemize}
       \item{負の数は，2の補数で表す．2の補数は次のようにして，求める．}
	    \begin{itemize}
	     \item{絶対値を2進数で表す．}
	     \item{その2進数をビット反転させる}
	     \item{ビット反転させた値に1を加算する．}
	    \end{itemize}
      \end{itemize}
\end{itemize}
%
メモリーの内容が出来上がったならば，以下を確認せよ．
%
\begin{itemize}
 \item{-1に1を加算したら，0になることを確認せよ．}
 \item{16ビットのビットパターンを見ると，符号付の32767の次は-32768にな
      ることを確認せよ．}
 \item{データの内容を符号無しの場合と比較せよ．面白いことに気がつくで
      あろう．}
 \item{負の数の場合，第15ビットが1になっていることを確認せよ．}
 \item{正の数の場合，第15ビットが0になっていることを確認せよ．}
 \item{第15ビットを見れば，正負が分かるので，これを符号ビットと言う．}
\end{itemize}
%
\begin{figure}[h!]
 \begin{center}
  \begin{tabular}{cp{5mm}||c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c||p{5mm}c}
  \multicolumn{1}{c}{アドレス} & \multicolumn{1}{c}{  } &
  \multicolumn{16}{c}{データ}  & \multicolumn{1}{c}{  } &
  \multicolumn{1}{c}{データ} \\
  \multicolumn{1}{c}{(16進数)} & \multicolumn{1}{c}{  } &
  \multicolumn{16}{c}{(2進数)}   & \multicolumn{1}{c}{  } &
  \multicolumn{1}{c}{(16進数)} \\
   %
   \texttt{AFFF} & &
   1&0&0&1&1&1&1&1&0&1&0&1&1&0&1&0& & 
   \texttt{9F5A} \\ \hline
   %
   \texttt{B000} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B001} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B002} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B003} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B004} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B005} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B006} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B007} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B008} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B009} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
   \texttt{B00A} & &
   & & & & & & & & & & & & & & & & &
   \texttt{} \\ \hline
   %
  \end{tabular}
  \caption{符号付整数を格納したときのメモリーの内容}
  \label{fig:memory_minus_integer}
 \end{center}
\end{figure}
%
%---------------------------------------------------------------------
\subsection{レポート提出要領}
%---------------------------------------------------------------------
提出方法は，次の通りとする．
% 
\begin{quote}
 \begin{tabular}{ll}
  期限 & 11月9日(金)PM1:00まで \\
  用紙 & A4 \\
  提出場所 & 山本研究室の入口のポスト \\
  表紙 & 表紙を1枚つけて，以下の項目を分かりやすく記述すること．\\
       & \qquad 授業科目名「電子計算機」\\
       & \qquad 課題名「課題3　メモリー中の整数の表現」\\
       & \qquad 3E\quad 学籍番号\quad 氏名\\
       & \qquad 提出日\\
  内容 & 問題の解答．計算課程をきちんと書くこと．\\
 \end{tabular}
\end{quote}
%
%
\newpage
%=====================================================================
\section{付録}
%=====================================================================
%---------------------------------------------------------------------
\subsection{実数の表現}
%--------------------------------------------------------------------
実際のコンピューターを用いた計算では，実数がよく使われる．ここでは，C言語の倍精
度実数型\command{double}で変数を宣言したときの，データの格納の仕方を示す．諸君に
とってはかなり難しいと思うので，ここは分かる者のみトライせよ．講義では説明しない．
%
%----------------------------
\subsubsection{浮動小数点表示}
%----------------------------
浮動小数点表示とは，指数化（例えば，$-0.123\times 10^{-2}$）して数値を表現する．
これは非常に便利な方法で，自然科学では多くつかわれる．コンピューターでも同様で，
データが整数と指定されない限りこの浮動小数点が用いられる．実際，この仮数部の
(-0.123)と指数の(-2)をメモリーに格納する．この方法の長所と短所は，以下の通りであ
る．
\begin{itemize}
 \item[長所]決められたビット数内で，非常に小さな数値から大きな数値まで表現可能になる．
 \item[短所]桁落ち誤差が発生する場合がある．
\end{itemize}
浮動小数点表示を学習するために，必要な言葉の意味は，図\ref{fig:floating_point}の
通りである．1年生の数学の授業で学習したはず．
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]
  {figure/floating_point.eps}
  \caption{指数表現の名称}
  \label{fig:floating_point}
 \end{center}
\end{figure}
%

%---------------------------------
\subsubsection{C言語の倍精度実数型}
%---------------------------------
IEEEの規格のC言語の倍精度実数型の\command{double}の表現について説明する．まず，浮動小数点
表示のための正規化を図\ref{fig:IEEE_normalize}に示す．当然，仮数部，指数部とも2進数表現です．仮数部は，符号と\tw{1.XXXX}のように表す．
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]
  {figure/IEEE_normalize.eps}
  \caption{IEEE規格表現のための規格化}
  \label{fig:IEEE_normalize}
 \end{center}
\end{figure}
%

つぎに，これをIEEE規格の浮動小数点に表すことを考える．まずその規格の仕様は，以下
のようになっている．
\begin{itemize}
\item 64ビット(第0ビット〜第63ビット)で，浮動小数を表わす．各ビットの構成は，図
      \ref{fig:IEEE_bit_spec}の通りである．
\item 最上位の第63ビットが仮数部の符号ビットである．正の場合ゼロで，負の場合1に
      なる．
\item 指数は11ビットでオフセットバイナリ方式で表す．11ビットで0〜2047の値に
      なる．ただし，指数部11ビットの値0と2047は例外処理のために予約されてい
      る．11ビットで表現される値からオフセット値1023を引くことにより指数の値が
      -1022〜1023の範囲になるように定められている．
\item 仮数部は52ビットである．小数点以下を，絶対値で表現する．規格化のための整数
      部は1と分かっているので，このためのビットは割り当てられていない．
\end{itemize}
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=1.0]
  {figure/IEEE_bit_spec.eps}
  \caption{IEEE規格(C言語の倍精度実数)表現のビットの内訳}
  \label{fig:IEEE_bit_spec}
 \end{center}
\end{figure}
%

以上の仕様をもとに，図\ref{fig:IEEE_normalize}で規格化された数を浮動小数点表示を
示す．ほとんどの部分は規格化で分かるが，指数のみ計算が必要である．指数は，オフセッ
トバイナリーで計算するために，まず10進数で表す．
\begin{align}
 (-1011)_2=(-8-2-1)_{10}=(-11)_{10}
\end{align}
不動小数表示の指数は，この式の値に 1023 を加算して求める．すると，
\begin{align}
(-11+1023)_{10}=(1012)_{10}=(1111110100)_2
\end{align}
となる．

これで，すべて準備が整った．不動小数点表示は，図\ref{fig:IEEE_example}のようにな
る．実際のコンピューターには，この64ビットのデータが格納される．メモリーは８ビッ
ト(1バイト)毎アドレスが割り当てられているので，8番地分のデータ領域が必要である．
%
\begin{figure}[H]
 \begin{center}
  \includegraphics[keepaspectratio, scale=0.5]
  {figure/IEEE_example.eps}
  \caption{IEEE規格の浮動小数点表示の例}
  \label{fig:IEEE_example}
 \end{center}
\end{figure}
%
%
%=====================================================================
\end{document}
