HOME»基本情報技術者試験掲示板»2の補数の表し方についての解説に疑問があります
投稿する
すみません、上記は誤りですね。2の補数を使う宣言をしたとき、4を表すには0100です。100とすると-4となります。
「100が4でもあり-4でもある」とすると、プログラムが毎回「この100は4なのか-4なのか」で混乱してしまうため、正の場合は頭に0をつけて識別できるようにする、という趣旨なのかと思いました。
こちらについては私は違和感を持ちませんでした。
ただ、質問者の指摘どおり、例えば8ビット長と想定して、
00000111 → 7
00001011 → 11
00010111 → 23
00110011 → 51
と表記すれば誤解が生じにくいだろうというのも、そのとおりだと思います。
2の補数の表し方についての解説に疑問があります [6041]
勉強中さん(No.1)
https://www.fe-siken.com/kakomon/30_haru/q1.html
例えばこちらの問題の解説では、10進数の-10を2の補数に変換すると0110となる、とあります。
しかし、Grok、Geminiなど複数のAIに聞いてみると、
など、いずれも0110は-10とみなせないとの解答でした。これはAIの解説通り、-10を2の補数で表すには5ビット以上必要なのでしょうか。
それともAIの解説が誤っており、4ビットでも-10を表せるのでしょうか。
例えばこちらの問題の解説では、10進数の-10を2の補数に変換すると0110となる、とあります。
しかし、Grok、Geminiなど複数のAIに聞いてみると、
>4ビットの2の補数表現で扱える数値の範囲は、−8から7までです。したがって、-10は4ビットでは表現できません。(Gemini)
>4ビットの2の補数で0110は-10を表しません(通常は+6)。-10を表現するには5ビット以上が必要で、4ビットでは範囲外です。(Grok)
など、いずれも0110は-10とみなせないとの解答でした。これはAIの解説通り、-10を2の補数で表すには5ビット以上必要なのでしょうか。
それともAIの解説が誤っており、4ビットでも-10を表せるのでしょうか。
2025.08.27 03:42
Damakanさん(No.2)
この投稿は投稿者により削除されました。(2025.08.27 06:32)
2025.08.27 06:32
勉強中さん(No.3)
ご回答ありがとうございます。いただいた解答を元に、改めて自身で検索及びAIに訪ねてみました(符号付き2進数と2の補数で-10を計算してと質問)。その結果、やはり2の補数で-10を計算するには5ビット必要で、10110でないと表せない、ということでした。
その理由として、
とのことでしたまた、2の補数計算機でも-8から7までの数値しか入力ができませんでした。(-10は範囲外)
つまり「2の補数を使う」と宣言した時点で、
例えば4を表すには011(頭の0で正の数字である事を宣言する)である必要があり、11としてしまうと-1を表す事になる、という事だと理解しました。
以上の認識で、誤っている点がありましたらご指摘いただけると幸いです。
その理由として、
>2の補数表現は、正の数と負の数を区別するために、必ず符号ビット(最上位ビット)を使います。
>符号ビットがない場合は最上位ビットを通常の数値の一部として扱い、すべての数が0以上の整数として表現する符号なし整数の形式になるからです。
とのことでしたまた、2の補数計算機でも-8から7までの数値しか入力ができませんでした。(-10は範囲外)
つまり「2の補数を使う」と宣言した時点で、
例えば4を表すには011(頭の0で正の数字である事を宣言する)である必要があり、11としてしまうと-1を表す事になる、という事だと理解しました。
以上の認識で、誤っている点がありましたらご指摘いただけると幸いです。
2025.08.27 05:04
勉強中さん(No.4)
>例えば4を表すには011(頭の0で正の数字である事を宣言する)である必要があり、11と>してしまうと-1を表す事になる、という事だと理解しました。
すみません、上記は誤りですね。2の補数を使う宣言をしたとき、4を表すには0100です。100とすると-4となります。
「100が4でもあり-4でもある」とすると、プログラムが毎回「この100は4なのか-4なのか」で混乱してしまうため、正の場合は頭に0をつけて識別できるようにする、という趣旨なのかと思いました。
2025.08.27 05:26
勉強中さん(No.5)
初学者ゆえ誤っている点がありましたらご指摘ください。
①1111111は255であるとするのが、0から255を表せる符号なし8ビット。
※(128+64+32+16+8+4+2+1)
②1111111は-1となる(頭の数値が1で負を表すため)「負数を2の補数で表現する2進表記法」の8ビット。符号が0ならば正を表す。
※元の数: 11111111
ビットを反転: 11111111 → 00000000
1を加える: 00000000 + 1 = 00000001
結果の解釈: 00000001は10進数で1なので、元の数は-1。
この問題の冒頭では、「負数を2の補数で表現する2進表記法」を用いる事が示されています。つまりこの問題文で扱う2進数は上記の②です。
このとき、この二進数で正の数を表すには頭に0をつける、負の数では1をつけるというルールが必要なはずです。
このルールがない、つまり負の数でも頭に1をつけないというルールだとすると、「0110は6でもあり-10でもある」事になってしまいます。このルールがあるからこそ「110は-2」「0110は6」「10110は-10」「010110は22」と重複する事なく数値を表せるはずです。
したがって、この問題の最後にある2の補数の解説で、「-10は2の補数で0110」は誤っていて、「-10は2の補数で10110」が正しいのではないかと思いました。
この問題で使うのは「負数を2の補数で表現する2進表記法」なので、0110は6にしかならないと思います。
また同様に、解説文の[正の数の場合]に以下のように書かれていますが、これも疑問があります。
111→7
1011→11
10111→23
110011→51
この問題で使うのは「負数を2の補数で表現する2進表記法」なので、7を表すためには以下のように頭に正の数である事を表す0が必要になるのではないでしょうか。
0111→7
01011→11
010111→23
0110011→51
が正しくなるかと思いました。頭が1であれば負の数を表すので、
111→-1
1011→-5
10111→-9
110011→-13
という計算結果になってしまうと思われます。
補数の概念に触れるのはこの問題が初めてなので、上記のような理解をしている私のほうが間違っている可能性がとても高いです。上記内容に誤りがあればご指摘いただければ幸いです。
①1111111は255であるとするのが、0から255を表せる符号なし8ビット。
※(128+64+32+16+8+4+2+1)
②1111111は-1となる(頭の数値が1で負を表すため)「負数を2の補数で表現する2進表記法」の8ビット。符号が0ならば正を表す。
※元の数: 11111111
ビットを反転: 11111111 → 00000000
1を加える: 00000000 + 1 = 00000001
結果の解釈: 00000001は10進数で1なので、元の数は-1。
この問題の冒頭では、「負数を2の補数で表現する2進表記法」を用いる事が示されています。つまりこの問題文で扱う2進数は上記の②です。
このとき、この二進数で正の数を表すには頭に0をつける、負の数では1をつけるというルールが必要なはずです。
このルールがない、つまり負の数でも頭に1をつけないというルールだとすると、「0110は6でもあり-10でもある」事になってしまいます。このルールがあるからこそ「110は-2」「0110は6」「10110は-10」「010110は22」と重複する事なく数値を表せるはずです。
したがって、この問題の最後にある2の補数の解説で、「-10は2の補数で0110」は誤っていて、「-10は2の補数で10110」が正しいのではないかと思いました。
この問題で使うのは「負数を2の補数で表現する2進表記法」なので、0110は6にしかならないと思います。
また同様に、解説文の[正の数の場合]に以下のように書かれていますが、これも疑問があります。
111→7
1011→11
10111→23
110011→51
この問題で使うのは「負数を2の補数で表現する2進表記法」なので、7を表すためには以下のように頭に正の数である事を表す0が必要になるのではないでしょうか。
0111→7
01011→11
010111→23
0110011→51
が正しくなるかと思いました。頭が1であれば負の数を表すので、
111→-1
1011→-5
10111→-9
110011→-13
という計算結果になってしまうと思われます。
補数の概念に触れるのはこの問題が初めてなので、上記のような理解をしている私のほうが間違っている可能性がとても高いです。上記内容に誤りがあればご指摘いただければ幸いです。
2025.08.27 06:39
Damakanさん(No.6)
私の回答に1部間違いがあったため先ほどの投稿を削除しました。
誤解を招くような表現を与えてしまい申し訳ございません。
2の補数では最上位の符号ビット(MSB)が0なら正、1なら負、と解釈してもらって大丈夫です。
誤解を招くような表現を与えてしまい申し訳ございません。
2の補数では最上位の符号ビット(MSB)が0なら正、1なら負、と解釈してもらって大丈夫です。
2025.08.27 06:47
勉強中さん(No.7)
ありがとうございます。ということはやはり、
「0110」は6を表すのが原則で、
「0110」が-10を表すのは、5ビット目に本来1があるにも関わらずエラーや桁溢れなどで表示されていないような特殊なケース…ということでよさそうでしょうか。
「0110」は6を表すのが原則で、
「0110」が-10を表すのは、5ビット目に本来1があるにも関わらずエラーや桁溢れなどで表示されていないような特殊なケース…ということでよさそうでしょうか。
2025.08.27 06:51
Damakanさん(No.8)
はい!その認識で間違いないです!
2025.08.27 07:00
勉強中さん(No.9)
ご回答ありがとうございます。完全に理解できた…と思います!
2025.08.27 07:00
jjon-comさん(No.10)
★FE プラチナマイスター
基本情報 平成30年 春期 午前 問1
https://www.fe-siken.com/kakomon/30_haru/q1.html
質問者の理解が正しく、解説文が間違っています。
解説文の「2の補数」の箇所について訂正依頼を出してみてはいかがですか。
はい、そのとおりです。
単なる「補数表現」というのは不正確で、補数表現はすべて「N桁の補数表現」と定義する必要があります。
ですから、10進数の-10を
5ビット長の2の補数で表現するなら 10110 ですし、
6ビット長の2の補数で表現するなら 110110 ですし、
7ビット長の2の補数で表現するなら 1110110 です。
質問者の指摘どおり、4ビット長以下では表現できませんから、
解説文の「2の補数」の箇所で例として用いる値は
10進数の-7以下に変更する、または、ビット長を5ビット以上に変更する、必要があります。
https://www.fe-siken.com/kakomon/30_haru/q1.html
質問者の理解が正しく、解説文が間違っています。
解説文の「2の補数」の箇所について訂正依頼を出してみてはいかがですか。
> AIの解説通り、-10を2の補数で表すには5ビット以上必要なのでしょうか。
> この二進数で正の数を表すには頭に0をつける、負の数では1をつけるというルールが必要なはずです。
はい、そのとおりです。
> 2の補数表現は、正の数と負の数を区別するために、必ず符号ビット(最上位ビット)を使います。
> この問題の最後にある2の補数の解説で、「-10は2の補数で0110」は誤っていて、
> 「-10は2の補数で10110」が正しいのではないかと思いました。
単なる「補数表現」というのは不正確で、補数表現はすべて「N桁の補数表現」と定義する必要があります。
ですから、10進数の-10を
5ビット長の2の補数で表現するなら 10110 ですし、
6ビット長の2の補数で表現するなら 110110 ですし、
7ビット長の2の補数で表現するなら 1110110 です。
質問者の指摘どおり、4ビット長以下では表現できませんから、
解説文の「2の補数」の箇所で例として用いる値は
10進数の-7以下に変更する、または、ビット長を5ビット以上に変更する、必要があります。
2025.08.27 09:07
jjon-comさん(No.11)
★FE プラチナマイスター
> また同様に、解説文の[正の数の場合]に以下のように書かれていますが、これも疑問があります。
> 111 → 7
> 1011 → 11
> 10111 → 23
> 110011 → 51
こちらについては私は違和感を持ちませんでした。
[正の数の場合]
正の数に対しては2の補数を適用しないので、2進数表現 xx…x11 をそのまま10進数に直すことを考えます(xは任意のビット)。
という解説文の表現でしたので、符号ビットを除き、ビット反転+1もしない、素の2進数の箇所のみを抽出して解説しているのだなと理解したからです。正の数に対しては2の補数を適用しないので、2進数表現 xx…x11 をそのまま10進数に直すことを考えます(xは任意のビット)。
ただ、質問者の指摘どおり、例えば8ビット長と想定して、
00000111 → 7
00001011 → 11
00010111 → 23
00110011 → 51
と表記すれば誤解が生じにくいだろうというのも、そのとおりだと思います。
2025.08.27 09:07
勉強中さん(No.12)
詳しいご解説ありがとうございます。管理者さんに問い合わせしてみようと思います。
2025.08.29 07:04
