• ベストアンサー

このプログラム例が何を伝えようとしているのか分かりません(C言語)

下記のプログラムは『独習C 第3版』に記載されている、あるソースコードです。 #include <stdio.h> int main(void) { short i; i = 1; i = i | 32768; printf("%hd", i); return 0; } 【質問】 このプログラムの説明として、 『次のプログラムは、最上位ビットをセットすることにより、iを負数にします(ここでは、短整数が16ビットであると仮定しています)。』 とありますが、実際に実行してみると、 -32767 となり、iが負数の-1になっていません。 自分で 1000 0000 0000 0000 (32768) 0000 0000 0000 0001 (i) --------------------------- 1000 0000 0000 0001 OR として計算して、答えをWindows付属の電卓で確認したら「32769」になります。 このプログラムは何を伝えようとしているのでしょうか? どうして「-1」ではなく「-32767」のような結果になるのでしょうか? どなたか教えて頂けないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「負数」というか, 「負の数」ですね. -32767 になる理由は, 「2の補数」を調べればわかるかも.

Guchiken
質問者

お礼

さっそくの回答ありがとうございます! 「i=1」でiにマイナス記号をつけて-1で負数だと思ってました。 あと、ちょっと調べるのが足らなかったようです…ごめんなさい! 自分で調べたところ、負数の表現には、符号付き絶対値、1の補数、2の補数があって、 そのうち2の補数表現が最も広く使用されており、2の補数は1の補数に1を加えたもの、ということが分かりました。 「-32767」はその2の補数表現で得られた数で、 0111 1111 1111 1111 (32767) これを1の補数にする(ビットを反転)。 1000 0000 0000 0000 これに1を加算。 1000 0000 0000 0001 (-32767) これが出力されていたことがわかりました。 回答ありがとうございました。

その他の回答 (3)

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.4

ANo3です。 訂正。 > つまり、「Windows付属の電卓」は、今回の確認には使えません。 と書きましたが、つかいかたによっては・・・ > 答えをWindows付属の電卓で確認したら「32769」になります。 これは、先ほど書いた理由できませんが、逆、つまり、 「-32767を2進にするとどうなるか」 はできますね。 手順; (1)電卓を起動して関数電卓にする。 (2)「2進」を選択する (3)「Word」を選択する (4)「10進」を選択する (5)「32767」と入力して「+/-」ボタンを押す (6)「2進」を選択する これで、「1000000000000001」が求まります。

Guchiken
質問者

お礼

回答ありがとうございます。 手順どおり実際にやってみました。 今後、参考にさせていただきます!! 2度も回答本当にありがとうございました。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.3

> 次のプログラムは、最上位ビットをセットすることにより、iを負数にします > 何を伝えようとしているのか 単に「最上位BITをいじると、負数(符号が「-」)に変わる」と言う事で、 「符号付整数の最上位BITが符号管理に関っている」事を意識させたいだけでしょう。 #「-1を掛けた値になる」という意味ではないです。 > 答えをWindows付属の電卓で確認したら「32769」になります。 「Windows付属の電卓」のヘルプには、 > 16 進数、8 進数、または 2 進数を 10 進数に変換すると、正の整数になります。 とあります。 つまり、「Windows付属の電卓」は、今回の確認には使えません。

Guchiken
質問者

お礼

回答ありがとうございます!! 負数の表現にはいろいろあって、だから必ずしも最上位ビットが「1」になったからといって、その数にマイナス記号が付くわけではないんですね! 単に「符号がマイナスに変わる」というだけのものなんですね! Windows付属の電卓のヘルプを確認しました!ヘルプも役に立つときがあるんですね! 回答どうもありがとうございました。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

>『次のプログラムは、最上位ビットをセットすることにより、iを負数にします(ここでは、短整数が16ビットであると仮定しています)。』 ここでの「iを負数にします」とは「iを、-32767と言う値の、負数にします」と言う意味です。 決して「iを-1にします」という意味ではありません。 >となり、iが負数の-1になっていません。 「-1になる」とは、どこにも書いてません。誰もそんな事は言ってません。 「負数になるとは、-1になる事である」って誰が決めたんですか?それは質問者さんの「勝手な思い込み」ですよ。 「-32767は負数」ですよ。「iが-32767になる」ってのは「iが負数になる」って意味も含んでます。 >1000 0000 0000 0000 (32768) >0000 0000 0000 0001 (i) >--------------------------- >1000 0000 0000 0001 OR ORした結果、最上位ビットが1になってますね。 0000 0000 0000 0000=0 0000 0000 0000 0001=1 0000 0000 0000 0010=2     | 0111 1111 1111 1110=32766 0111 1111 1111 1111=32767 1000 0000 0000 0000=-32768 1000 0000 0000 0001=-32767  ←ここに注目 1000 0000 0000 0010=-32766     | 1111 1111 1111 1110=-2 1111 1111 1111 1111=-1 >どうして「-1」ではなく「-32767」のような結果になるのでしょうか? 質問者さんが2進数でORした結果が「-32767と同じビット並び」になってますが、何か疑問でも?

Guchiken
質問者

お礼

回答ありがとうございます!! 「i=1」でiにマイナス記号をつけて-1で負数だと思ってました。 あと、ちょっと調べるのが足らなかったようです…ごめんなさい! 自分で 1000 0000 0000 0000 (32768) 0000 0000 0000 0001 (i) --------------------------- 1000 0000 0000 0001 OR と計算した答えが、負数の表現の1つである、「符号付き絶対値」の表現だと思い込んで、 最上位ビットの「1」が負を表し、残りのビット「000 0000 0000 0001」で絶対値1を表し、それで、「-1」だと思い込んでいました… 2の補数での表現であるとは思ってもいませんでした! それなら、「1000 0000 0000 0001」が「-32767」になるのも分かります。 お騒がせいたしました… 未熟者の私でも丁寧に回答していただき本当にありがとうございました。

関連するQ&A