資格道場 › レッスン一覧 › 基礎理論
基礎理論・2/13・12分

負数の表し方と2の補数

ゴール

負の数を2の補数で表す・読み戻す計算(固定小数点を含む)ができ、1の補数・符号付き絶対値との違い、8ビットで表せる範囲、下位ビットと余りの関係を問う問題を自力で解けるようになる。

コンピュータは引き算を「負の数の足し算」として計算するので、負の数の表し方は計算の仕組みそのものです。手順さえ覚えれば確実に取れる計算問題なので、科目Aの得点源になります。

このレッスンで稽古する(用語チェック・過去問)

結論:2の補数は「全ビット反転して+1」

負の数を2の補数で表すときは、絶対値を2進数にし、全ビットを反転(0と1を入れ替え)して、最後に1を足します。逆に、2の補数で表された負の数から絶対値を求めるときも、**同じ「反転して+1」**をします。行きも帰りも同じ操作なので、覚えることは1つだけです。

例:8ビットで −82 を表す場合

手順 ビット列
82 を2進数にする 01010010
全ビット反転 10101101
+1 10101110(これが −82)

**反転しただけで止めたもの(10101101)は「1の補数」**という別の表し方です。試験ではこの「+1を忘れた値」が必ず選択肢に入っています。

たとえ:車の走行距離メーターを巻き戻す

4桁のメーターが 0000 のときに1つ巻き戻すと 9999 になります。つまり「9999 は 0 の1つ手前=−1」と読む決まりにしてしまう、というのが補数の考え方です。2進数でも同じで、8ビットの 00000000 から1引くと 11111111 になり、これを −1 とします。

式で書くと、nビットの2の補数は 2^n − 絶対値 です。8ビットなら 256 − 82 = 174 = 10101110 となり、「反転して+1」と同じ結果になります。検算に使えます。

00000000 = 000000001 = 111111111 = −101111111 = 12710000000 = −128+1−18ビット=256通り0 から右回りに+10 から左回りに−10 の1つ手前が −1127 の次は −128(ここが正と負の境目)
8ビットの値を一周する輪に並べると、0 から1つ戻った 11111111 が −1 になり、127 の次が −128 になる。

全ビットが1のときは −1

11111111 に 1 を足すと 1 00000000 となり、9ビット目にはみ出した1(桁上がり=キャリー)は捨てます。残るのは 00000000=0 なので、「1を足すと0になる数」= −1 です。nビットでも同じで、1111…11 は常に −1 です。

ここで捨てたキャリーは2の補数の足し算では正常な動作で、オーバフローではありません。−1+1=0 は表せる範囲に収まった正しい結果です。オーバフローは、結果そのものが範囲(8ビットなら −128〜127)を超えたとき、例えば 127+1 で起きます。

先頭ビットは符号を表す

2の補数では、最上位ビット(左端)が0なら0以上、1なら負です。選択肢で負の数を答える問題なら、先頭が0の選択肢はその場で消せます。

ただし、先頭ビットは「符号だけを表す飾り」ではなく、−2^(n−1) の重みを持つ桁として計算に参加しています。8ビットなら先頭は −128 の重みで、10101110 = −128 + 32 + 8 + 4 + 2 = −82 と直接計算することもできます。

10101110 を重みで読む−128643216842110101110−12803208420−128 + 32 + 8 + 4 + 2 = −82先頭ビットは −128 の重みで計算に参加する
10101110 の各ビットに重みを掛けると、先頭の −128 も計算に参加して合計 −82 になる。

固定小数点のときは「最下位ビットに+1」

固定小数点数は、小数点の位置をあらかじめ決めておく表し方です。2の補数にする手順は整数と同じで、「+1」は一番右のビットに足します。小数部が4ビットなら、その1は 1/16 の重みです。

楽な方法として、小数点以下のビット数ぶん2倍して整数にしてから計算できます。小数部4ビットなら ×16 して整数として2の補数を作り、ビット列はそのまま答えになります。

整数部小数部4ビット.1/21/41/81/16+1 は一番右のビットに足す楽な方法:×16 で小数点を4ビット右へ.整数として「反転して+1」で2の補数を作るビット列はそのまま答えになる
小数部4ビットの固定小数点では+1を一番右(1/16 の重み)に足す。×16 すると小数点が右端に移り、整数と同じ手順で計算できる。

負の数の3つの表し方を比較

試験では同じビット列を3通りに読ませる問題が出ます。4ビットの 1101 で比べると次のとおりです。

方式 負の数の作り方 1101 の値 0 の表し方 4ビットの範囲
2の補数 反転して+1 −3 0000 の1通り −8〜7
1の補数 反転だけ −2 0000 と 1111 の2通り −7〜7
符号付き絶対値 先頭を1にし、残りは絶対値そのまま −5 0000 と 1000 の2通り −7〜7

読み方:1の補数 1101 → 反転 0010=2 → −2。2の補数 1101 → 反転して+1 0011=3 → −3。符号付き絶対値 1101 → 先頭1で負、残り101=5 → −5。2の補数だけ0が1通りなので、負の側に1つ多く表せます。

4ビットの 1101 を3通りに読む符号付き絶対値:−52の補数:−31の補数:−2−8−7−6−5−4−3−2−1012345672の補数の範囲は −8〜7(負の側が1つ多い)1の補数・符号付き絶対値は −7〜7
同じ 1101 でも、方式によって数直線上の −5・−3・−2 の別々の位置を指す。

表せる範囲:8ビットは −128〜127

nビットの2の補数で表せる整数は −2^(n−1) 〜 2^(n−1)−1 です。0 を正の側に含めるので、正の側が1つ少なくなります。

表し方(8ビット) 範囲
符号なし 0〜255
2の補数 −128〜127
1の補数・符号付き絶対値 −127〜127

最小値 −128 は 10000000、最大値 127 は 01111111 です。「−127〜127」は1の補数か符号付き絶対値、「0〜255」は符号なしの範囲なので、見たら除外します。

下位2ビットと「4で割った余り」

下位2ビットは、その数を4で割った余りを表します(2^2=4 なので)。下位2ビットが 11 なら、正の数は 4×整数+3 の形なので余り3です。例:7=00000111、11=00001011。

負の数では注意が要ります。−1=11111111、−5=11111011 も下位2ビットは 11 ですが、商を「絶対値の小数点以下を切り捨て」で求めると、−1÷4 は商0・余り −1、−5÷4 は商−1・余り −5−(−4)=−1 です。つまり余りは3でも−3でもなく −1 になります。問題文の「除算の商は絶対値の小数点以下を切り捨て」という条件が、この符号の扱いを決めています。

試験での問われ方

  • 変換問題:負の10進数→2の補数(固定小数点を含む)、または2の補数→絶対値。選択肢には1の補数(+1忘れ)と小数点位置のずれが必ず入っている
  • 全ビット1は?:−1。符号なしの 2^n−1 と取り違えさせる
  • 方式の比較:同じビット列を3方式で読んで大小を並べる
  • 範囲:8ビット −128〜127。−127〜127 や 0〜255 と取り違えさせる
  • 余り:下位ビットから余りを推理する。正負で場合分けする
例題 1

−5.625 を8ビット固定小数点(小数部4ビット)の2の補数にする

10 進数 −5.625 を,8 ビット固定小数点形式による 2 進数で表したものはどれか。ここで,小数点位置は 3 ビット目と 4 ビット目の間とし,負数には 2 の補数表現を用いる。
8 個のマス目(左からビット 7,6,5,4,3,2,1,0)。ビット 3 とビット 4 の間(4 ビット目と 3 ビット目の間)に「小数点位置」の矢印。

ア 01001100
イ 10100101
ウ 10100110
エ 11010011

出典:平成23年度 秋期 基本情報技術者試験 午前 問2

解き方と答えを見る
  1. 小数点はビット4とビット3の間なので、整数部4ビット(ビット7〜4)+小数部4ビット(ビット3〜0)。
  2. 5.625 を整数部と小数部に分ける:5 と 0.625。
  3. 整数部 5 = 0101(4+1)。
  4. 小数部 0.625 = 0.5 + 0.125 = 2^−1 + 2^−3 なので、小数部4ビットは 1010。
  5. +5.625 = 0101.1010 → ビット列 01011010。
  6. 全ビット反転:10100101(ここで止めると1の補数=選択肢イのひっかけ)。
  7. 最下位ビットに1を足す:10100101 + 00000001 = 10100110。
  8. 検算:5.625 × 16 = 90。256 − 90 = 166 = 10100110 で一致。
  9. 先頭が1で負の数になっていることも確認(先頭0のアは正の数なので除外)。

答え:10100110(ウ)

例題 2

2の補数 10101110 の絶対値を求める

2の補数で表された負数10101110の絶対値はどれか。

ア 01010000
イ 01010001
ウ 01010010
エ 01010011

出典:基本情報技術者試験 科目A免除 修了試験 20220612 実施分 問3

解き方と答えを見る
  1. 先頭ビットが1なので負の数。絶対値は「反転して+1」で求める。
  2. 全ビット反転:10101110 → 01010001(ここで止めるとイのひっかけ)。
  3. +1:01010001 + 00000001 = 01010010。
  4. 検算:01010010 = 64+16+2 = 82。10101110 を直接読むと −128+32+8+4+2 = −82 で一致。

答え:01010010(ウ)

例題 3

全ビットが1の nビット「1111…11」の値

負数を 2 の補数で表すとき,全てのビットが 1 である n ビットの 2 進数 “1111…11”が表す数値又はその数式はどれか。

ア -(2^(n-1)-1)
イ -1
ウ 0
エ 2^n-1

出典:基本情報技術者試験 科目A免除 修了試験 20200126 実施分 問1

解き方と答えを見る
  1. 1111…11 に 1 を足すと 1 0000…00 となり、最上位からはみ出した桁上がり(キャリー)を捨てると 0000…00 = 0。
  2. キャリーを捨てるのは2の補数の足し算の正常な動作で、オーバフローではない(−1+1=0 は範囲内の正しい結果)。
  3. 「1を足すと0になる数」なので −1。
  4. エ(2^n−1)は同じビット列を符号なしで読んだ値なので誤り。

答え:−1(イ)

例題 4

4ビット 1101 を3方式で読んで小さい順に並べる

負の整数を表現する代表的な方法として,次の 3 種類がある。 a 1 の補数による表現 b 2 の補数による表現 c 絶対値に符号を付けた表現(左端ビットが 0 の場合は正,1 の場合は負) 4 ビットのパターン 1101 を a~c の方法で表現したものと解釈したとき,値が小さい順になるように三つの方法を並べたものはどれか。

ア a,c,b
イ b,a,c
ウ b,c,a
エ c,b,a

出典:基本情報技術者試験 科目A免除 修了試験 20190728 実施分 問2

解き方と答えを見る
  1. a 1の補数:先頭1なので負。反転 0010 = 2 → −2。
  2. b 2の補数:先頭1なので負。反転して+1:0010+1 = 0011 = 3 → −3。(別解:−8+4+1 = −3)
  3. c 符号付き絶対値:先頭1で負、残り 101 = 5 → −5。
  4. 小さい順:−5(c)< −3(b)< −2(a)。

答え:c,b,a(エ)

例題 5

下位2ビットが「11」の整数を4で割った余り

ある整数値を,負数を 2 の補数で表現する 2 進表記法で表すと最下位 2 ビットは“11”であった。10 進表記法の下で,その整数値を 4 で割ったときの余りに関する記述として,適切なものはどれか。ここで,除算の商は,絶対値の小数点以下を切り捨てるものとする。

ア その整数値が正ならば 3
イ その整数値が負ならば -3
ウ その整数値が負ならば 3
エ その整数値の正負にかかわらず 0

出典:平成30年度 春期 基本情報技術者試験 午前 問1

解き方と答えを見る
  1. 下位2ビットは4で割った余りの情報を持つ(2^2=4)。
  2. 正の場合:例 3=011、7=111、11=1011。どれも 4×整数+3 なので余りは3 → アは正しい。
  3. 負の場合:例 −1=11111111。−1÷4 = −0.25 → 絶対値の切り捨てで商0、余り −1 − 0 = −1。
  4. 別の負の例 −5=11111011。−5÷4 = −1.25 → 商 −1、余り −5 − (−4) = −1。
  5. 負なら余りは −1 なので、イ(−3)・ウ(3)は誤り。0 になる例もないのでエも誤り。

答え:その整数値が正ならば3(ア)

要点(試験直前に読む)

  • 2の補数は「全ビット反転して+1」。負→絶対値に戻すときも同じ操作。
  • 検算は「2^n − 絶対値」。8ビットなら 256 − 絶対値。
  • 全ビット1(1111…11)は −1。出たキャリーを捨てるのは正常で、オーバフローではない。
  • 8ビットの2の補数は −128〜127(nビットなら −2^(n−1)〜2^(n−1)−1)。
  • 1101 は 1の補数 −2/2の補数 −3/符号付き絶対値 −5。
  • 固定小数点は小数部のビット数ぶん2倍して整数にしてから計算すると楽(小数部4ビットなら ×16)。

ひっかけ

  • 反転だけして+1を忘れた値(1の補数)が必ず選択肢にある → 最後に「+1したか」を確認する。
  • 固定小数点で小数点の位置をずらした値 → 図で小数点がどのビットの間か数え直し、×2^(小数部ビット数) の整数で検算する。
  • 範囲で −127〜127(1の補数・符号付き絶対値)や 0〜255(符号なし)を混ぜてくる → 2の補数は負の側が1つ多い −128〜127。
  • 1111…11 を符号なしの 2^n−1 と読ませる → 2の補数なら −1。
  • 負の数でも余りは3(または−3)と思わせる → 絶対値の切り捨てなら、下位2ビット11の負の数の余りは −1。−1 や −5 で実際に計算して確かめる。

用語(11)

2の補数 にのほすう
負の数を「絶対値の全ビットを反転して1を足した値(=2^n−絶対値)」で表す方式で、コンピュータの整数表現の標準。
⚠ 1の補数は反転だけで+1をしない。選択肢で「+1忘れ」の値が出たらそれが1の補数。
1の補数 いちのほすう
負の数を絶対値の全ビットを反転しただけの値で表す方式。
⚠ 2の補数との違いは+1の有無。1の補数は0が2通り(0000と1111)あり、範囲が −127〜127(8ビット)になる。
符号付き絶対値表現 ふごうつきぜったいちひょうげん
先頭ビットを符号(0が正・1が負)にし、残りのビットに絶対値をそのまま入れる方式。
⚠ 補数系と違い、残りのビットを反転しない。1101 は −5(2の補数なら −3)。
符号ビット ふごうビット
最上位ビットのことで、0なら0以上、1なら負の数を示す。
⚠ 2の補数では符号を示すだけでなく −2^(n−1) の重みを持つ桁として計算に参加する。
最上位ビット MSB(Most Significant Bit)
ビット列の一番左、重みが最も大きいビット。
⚠ 最下位ビット(LSB)は一番右。「+1」はLSBに足す。
最下位ビット LSB(Least Significant Bit)
ビット列の一番右、重みが最も小さいビット。
⚠ 固定小数点では、LSBの重みは1ではなく小数部の最小単位(小数部4ビットなら1/16)。
固定小数点数 こていしょうすうてんすう
小数点の位置をあらかじめ決めておき、その位置を前提にビット列を読む数の表し方。
⚠ 浮動小数点数は指数部で小数点の位置を動かす別方式。固定小数点の問題では小数点がどのビットの間かを必ず確認する。
桁上がり(キャリー) けたあがり(Carry)
足し算で最上位ビットからはみ出す1のこと。
⚠ 2の補数の足し算でキャリーを捨てるのは正常な動作で、オーバフローではない。11111111(−1)+1=0 はキャリーが出るが範囲内の正しい結果。
オーバフロー Overflow(桁あふれ)
計算結果がそのビット数で表せる範囲を超えて、正しい値を表せなくなること。
⚠ キャリーとは別物。8ビットの2の補数では結果が −128〜127 を超えたとき(例:127+1 が 10000000=−128 になってしまう)に起きる。
表現範囲 ひょうげんはんい
nビットで表せる数の最小値から最大値までの幅で、2の補数なら −2^(n−1)〜2^(n−1)−1。
⚠ 符号なしは 0〜2^n−1、1の補数・符号付き絶対値は −(2^(n−1)−1)〜2^(n−1)−1。8ビットなら 0〜255 と −127〜127。
剰余 じょうよ
割り算の余りのこと。
⚠ 負の数では商の決め方(絶対値の切り捨てか、小さい方への切り捨てか)で余りの符号が変わる。問題文の条件を必ず読む。

このレッスンの過去問

このレッスンで稽古する