符号付整数
[Wikipedia|▼Menu]

符号付数値表現(ふごうつきすうちひょうげん)の記事では、コンピュータシステムにおける数の表現(コンピュータの数値表現)において、負の範囲も含んで(正の数と負の数の記事も参照)を表現する方法を解説する。

コンピュータで負の数を表す方法は、用途などにあわせいくつかある。ここでは、二進記数法を拡張して負の数を表す方法を四種類説明する(#符号-仮数部#1の補数#2の補数#エクセス N)。ほとんどの場合、最近のコンピュータでは2の補数表現を使うが、他の表現が全く使われないわけではない(おそらく、最も使われている2の補数以外の表現は、浮動小数点の表現内に含まれるエクセス1023であろう)。
符号・絶対値表現詳細は「符号属性」を参照

8 ビット 符号・絶対値ビットパターン符号・絶対値表現符号無し表現
0000000000
0000000111
………
01111111127127
10000000−0128
………
11111111−127255

符号・絶対値表現(ふごうぜったいちひょうげん、(: sign-magnitude representation)は通常の位取り記数法で行うよう、正および負の数を表す符号(+ および −)として1つのビットを使い(符号ビット(英語版))、残りのビットでその数の絶対値を表す符号付きの数の表現方法である。符号・絶対値表現において、符号ビットの値が 0 なら符号は +、1 なら符号は − が付くものと見なされる。符号ビットは通常最上位ビット(MSB)に割り当てられ、下位のビット列で絶対値を表す(例:8ビット符号・絶対値表現において十進数 −43 は二進数 10101011、+43 は 00101011 で表される)。

8ビットで数値を表す場合、符号は1ビット、絶対値は7ビットで表現される。この場合、絶対値の範囲は 0000000 から 1111111 まで(十進法で +0 から +127 まで)である。したがって、8ビットの符号・絶対値表現で表せる数の範囲は −127 から +127 である。

符号・絶対値表現において、0 を表す方法は 00000000 (+0) と 10000000 (−0) の2通りある。

初期の二進コンピュータ(例えばIBM 7090)はこの表現方法を採用していたものもある。また、多くの十進コンピュータは符号・絶対値表現を用いている。
1の補数詳細は「1の補数」を参照

8 ビット 1の補数ビットパターン1の補数表現符号無し表現
0000000000
0000000111
.........
01111101125125
01111110126126
01111111127127
10000000?127128
10000001?126129
10000010?125130
.........
11111110?1254
11111111?0255

二進数における1の補数表現は、負の数の表現に絶対値のビット単位のNOTを適用することで得られる。符号-仮数部 表現のように、1の補数でも 0 には二種類の表現がある(00000000 (+0), 11111111 (−0))。

例えば、00101011 (43) の1の補数は、11010100 (−43) である。1バイト幅で1の補数で表せる数値の範囲は −12710 から +12710 となる。

この体系でふたつの数の足し算をするには、まず通常の二進数の加算を行い、演算の結果出てきたキャリー(桁あふれ)を戻して加算する必要がある。なぜそうなるのかを知るために、−1 (11111110) と +2 (00000010) を加算してみよう。二進数の加算を行うと 00000000 となってしまい、正しい答えではない。これにあふれた桁(キャリー)を加算すると正しい答え (00000001)が出てくるのである。

この数値表現体系は古いコンピュータでは一般的だった。PDP-1とかUNIVAC 1100/2200 seriesなど多くのシステムが1の補数を使っていた。

なお、「1の補数」表現とは、英語では ones' complement 、すなわちoneの複数形onesの所有格であり、「2の補数」が two's complement、すなわちtwoの単数形の所有格であるのと異なる。これは、1の補数が実際には 1 がずらっと並んだものから元の数を引くことで符号を反転させるためである。2の補数では単一の2のべき乗から元の数を引いて符号を反転させる。[1]

IPv4のヘッダーチェックサムは1の補数を使っている。

指数-仮数部表現で負数の仮数部をビット毎に反転させると、1の補数表現に変換される。
2の補数詳細は「2の補数」を参照

8 ビット 2の補数ビットパターン2の補数表現符号無し表現
0000000000
0000000111
.........
01111110126126
01111111127127
10000000?128128
10000001?127129
10000010?126130
.........
11111110?2254
11111111?1255

0が二種類の表現を持つという問題、キャリーを戻して加算しなければならない問題は、2の補数という体系を使うことで回避できる。2の補数では、負の数は(符号なしの感覚で言うと)1の補数より1だけ大きいビットパターンで表される。

例えば、8ビットの整数では値は右表のようになる。2の補数では、ゼロ(00000000)は一種類しかない。ある値の符号を反転した値を得るには、(元の数値が正か負かに関係なく)全ビットを反転させてから 1 を足す。2の補数での加算は符号無しの数値と同じである(ただし、オーバーフローの検出方法は異なる)。右表を見ればわかるとおり、127 と −128 の加算は、符号無しの 127 と 128 を加算するのと同じである。

ある数の2の補数を簡単に得る方法は以下の通りである。例 1例 2
1. 右端から見ていき、最初の '1' を探す01010010101100
2. その '1' より左側のビット列を反転させる10101111010100

エクセス N

8 ビット エクセス127ビット列エクセス127表現
としての解釈符号なし表現
としての解釈
00000000?1270
00000001?1261
.........
011111110127
10000000+1128
.........
11111111+128255

エクセスN は、事前に定めた正の整数N をバイアス値(偏り)として用いる表現。ある整数は、元の値よりN だけ大きい符号なし整数として表現される。例えば、値 0 は N として表され、値 −N は 0 として表される。N として、2m −1 がよく用いられる。バイアス表現、下駄ばき表現、またはオフセット・バイナリ (offset binary) とも呼ばれる。

この表現は、浮動小数点数の指数部でよく用いられている。IEEE浮動小数点標準では、単精度(32ビット)の指数部は8ビットのエクセス127として定義されている。倍精度(64ビット)では11ビットのエクセス1023である。
比較表

以下の表は 4 ビットでの各表現方法で、最大 +8 から ?8 までの整数を表現したものの比較表である。

4ビット整数表現十進符号無し符号-仮数部1の補数2の補数エクセス7
+81000N/AN/AN/A1111
+701110111011101111110
+601100110011001101101
+501010101010101011100
+401000100010001001011
+300110011001100111010
+200100010001000101001
+100010001000100011000
(+)000000000000000000111
(?)0N/A10001111N/AN/A
?1N/A1001111011110110
?2N/A1010110111100101
?3N/A1011110011010100
?4N/A1100101111000011
?5N/A1101101010110010
?6N/A1110100110100001
?7N/A1111100010010000
?8N/AN/AN/A1000N/A

出典[脚注の使い方]^ ドナルド・クヌース The Art of Computer Programming, Volume 2: 4.1節

参考文献

Flores, Ivan (1963). The Logic of Computer Arithmetic. Prentice-Hall 

Koren, Israel (2002). Computer Arithmetic Algorithms. A.K. Peters. .mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation.cs-ja1 q,.mw-parser-output .citation.cs-ja2 q{quotes:"「""」""『""』"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free a,.mw-parser-output .citation .cs1-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited a,.mw-parser-output .id-lock-registration a,.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription a,.mw-parser-output .citation .cs1-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:#d33}.mw-parser-output .cs1-visible-error{color:#d33}.mw-parser-output .cs1-maint{display:none;color:#3a3;margin-left:0.3em}.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}ISBN 1-56881-160-8 

関連項目

整数型

3増し符号

コンピュータの数値表現

負のゼロ










データ型
ビット列

ビット

トリット

ニブル

オクテット

バイト

ワード

ダブルワード(英)

数値

整数型

符号付整数型

十進型(英語版)

有理数型(英語版)

実数型

複素数型

固定小数点型

浮動小数点型

半精度


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:17 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef