負数の表し方と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」と同じ結果になります。検算に使えます。
全ビットが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 と直接計算することもできます。
固定小数点のときは「最下位ビットに+1」
固定小数点数は、小数点の位置をあらかじめ決めておく表し方です。2の補数にする手順は整数と同じで、「+1」は一番右のビットに足します。小数部が4ビットなら、その1は 1/16 の重みです。
楽な方法として、小数点以下のビット数ぶん2倍して整数にしてから計算できます。小数部4ビットなら ×16 して整数として2の補数を作り、ビット列はそのまま答えになります。
負の数の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つ多く表せます。
表せる範囲: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 と取り違えさせる
- 余り:下位ビットから余りを推理する。正負で場合分けする
−5.625 を8ビット固定小数点(小数部4ビット)の2の補数にする
ア 01001100
イ 10100101
ウ 10100110
エ 11010011
解き方と答えを見る
- 小数点はビット4とビット3の間なので、整数部4ビット(ビット7〜4)+小数部4ビット(ビット3〜0)。
- 5.625 を整数部と小数部に分ける:5 と 0.625。
- 整数部 5 = 0101(4+1)。
- 小数部 0.625 = 0.5 + 0.125 = 2^−1 + 2^−3 なので、小数部4ビットは 1010。
- +5.625 = 0101.1010 → ビット列 01011010。
- 全ビット反転:10100101(ここで止めると1の補数=選択肢イのひっかけ)。
- 最下位ビットに1を足す:10100101 + 00000001 = 10100110。
- 検算:5.625 × 16 = 90。256 − 90 = 166 = 10100110 で一致。
- 先頭が1で負の数になっていることも確認(先頭0のアは正の数なので除外)。
答え:10100110(ウ)
2の補数 10101110 の絶対値を求める
ア 01010000
イ 01010001
ウ 01010010
エ 01010011
出典:基本情報技術者試験 科目A免除 修了試験 20220612 実施分 問3
解き方と答えを見る
- 先頭ビットが1なので負の数。絶対値は「反転して+1」で求める。
- 全ビット反転:10101110 → 01010001(ここで止めるとイのひっかけ)。
- +1:01010001 + 00000001 = 01010010。
- 検算:01010010 = 64+16+2 = 82。10101110 を直接読むと −128+32+8+4+2 = −82 で一致。
答え:01010010(ウ)
全ビットが1の nビット「1111…11」の値
ア -(2^(n-1)-1)
イ -1
ウ 0
エ 2^n-1
出典:基本情報技術者試験 科目A免除 修了試験 20200126 実施分 問1
解き方と答えを見る
- 1111…11 に 1 を足すと 1 0000…00 となり、最上位からはみ出した桁上がり(キャリー)を捨てると 0000…00 = 0。
- キャリーを捨てるのは2の補数の足し算の正常な動作で、オーバフローではない(−1+1=0 は範囲内の正しい結果)。
- 「1を足すと0になる数」なので −1。
- エ(2^n−1)は同じビット列を符号なしで読んだ値なので誤り。
答え:−1(イ)
4ビット 1101 を3方式で読んで小さい順に並べる
ア a,c,b
イ b,a,c
ウ b,c,a
エ c,b,a
出典:基本情報技術者試験 科目A免除 修了試験 20190728 実施分 問2
解き方と答えを見る
- a 1の補数:先頭1なので負。反転 0010 = 2 → −2。
- b 2の補数:先頭1なので負。反転して+1:0010+1 = 0011 = 3 → −3。(別解:−8+4+1 = −3)
- c 符号付き絶対値:先頭1で負、残り 101 = 5 → −5。
- 小さい順:−5(c)< −3(b)< −2(a)。
答え:c,b,a(エ)
下位2ビットが「11」の整数を4で割った余り
ア その整数値が正ならば 3
イ その整数値が負ならば -3
ウ その整数値が負ならば 3
エ その整数値の正負にかかわらず 0
解き方と答えを見る
- 下位2ビットは4で割った余りの情報を持つ(2^2=4)。
- 正の場合:例 3=011、7=111、11=1011。どれも 4×整数+3 なので余りは3 → アは正しい。
- 負の場合:例 −1=11111111。−1÷4 = −0.25 → 絶対値の切り捨てで商0、余り −1 − 0 = −1。
- 別の負の例 −5=11111011。−5÷4 = −1.25 → 商 −1、余り −5 − (−4) = −1。
- 負なら余りは −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)
負の数を「絶対値の全ビットを反転して1を足した値(=2^n−絶対値)」で表す方式で、コンピュータの整数表現の標準。
⚠ 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) の重みを持つ桁として計算に参加する。
ビット列の一番左、重みが最も大きいビット。
⚠ 最下位ビット(LSB)は一番右。「+1」はLSBに足す。
ビット列の一番右、重みが最も小さいビット。
⚠ 固定小数点では、LSBの重みは1ではなく小数部の最小単位(小数部4ビットなら1/16)。
小数点の位置をあらかじめ決めておき、その位置を前提にビット列を読む数の表し方。
⚠ 浮動小数点数は指数部で小数点の位置を動かす別方式。固定小数点の問題では小数点がどのビットの間かを必ず確認する。
足し算で最上位ビットからはみ出す1のこと。
⚠ 2の補数の足し算でキャリーを捨てるのは正常な動作で、オーバフローではない。11111111(−1)+1=0 はキャリーが出るが範囲内の正しい結果。
計算結果がそのビット数で表せる範囲を超えて、正しい値を表せなくなること。
⚠ キャリーとは別物。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。
割り算の余りのこと。
⚠ 負の数では商の決め方(絶対値の切り捨てか、小さい方への切り捨てか)で余りの符号が変わる。問題文の条件を必ず読む。
このレッスンの過去問
- 負数の2の補数表現(固定小数点)平成23年度 秋期 基本情報技術者試験 午前 問2
- 負数表現方式の比較(1の補数・2の補数・符号付き絶対値)基本情報技術者試験 科目A免除 修了試験 20190728 実施分 問2
- 2の補数表現で表せる整数の範囲基本情報技術者試験 科目A免除 修了試験 20250126 実施分 問1
- 2の補数表現と4で割った余り平成30年度 春期 基本情報技術者試験 午前 問1