- ベストアンサー
このプログラム例が何を伝えようとしているのか分かりません(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」のような結果になるのでしょうか? どなたか教えて頂けないでしょうか?
- みんなの回答 (4)
- 専門家の回答
お礼
さっそくの回答ありがとうございます! 「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) これが出力されていたことがわかりました。 回答ありがとうございました。