- ベストアンサー
整数の出力について
Cを学習を始めたばかりのものですが、int と unsinged int のことで少しわからないことがあります。 int plus3 = 3, minus3 = -3; double ddt1, ddt2; と変数宣言し、 main関数で ddt1 = minus3 + 1; ddt2 = minus3 + 1U; として出力したところ ddt1は-2.0 ddt2は4294967294.0 となりました。 ddt1の結果はわかるのですが、ddt2はなぜ 4294967294.0 になるのでしょうか? 1Uの効果でunsinged型にあわせて計算しているのでしょうか? もしそうだとしたら minus3 が 4294967293 になると思うのですが、なぜminus3 が 4294967293 になるのでしょうか? 説明が不足ならまたつけたしますのでどうか教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
169という数値を例とします。 169 =100+60+9 =1*100+6*10+9*1 =1*(10の2乗)+6*(10の1乗)+9*(10の0乗) となります。 各々の「a*(bのc乗)」に着目します。 a:もとの数値の各桁の数字 b:10で固定(だから10進数といいます) c:いちばん右から0、1、2と増えていく ここで、0169という表記のことを考えます。途中を省略すると、 0169 =0*(10の3乗)+1*(10の2乗)+6*(10の1乗)+9*(10の0乗) となります。 最初の項である「0*(10の3乗)」は、「0に何を掛けても0」という原則から0です。 その結果、 1*(10の2乗)+6*(10の1乗)+9*(10の0乗) =0*(10の3乗)+1*(10の2乗)+6*(10の1乗)+9*(10の0乗) となり、169=0169となります。 同様に、00169も、000169も、0・・・0169も、すべて「百六十九」です。 話を元に戻します。 2進数の 010101010 と 10101010 が同じかどうか、という話でした。 答えは、もうおわかりですね。
その他の回答 (6)
- asuncion
- ベストアンサー率33% (2127/6289)
>int a = 011; 「C言語では」先頭にゼロを付けると、8進数であるとみなすことになっています。 したがって、この値が10進で9になるのは正しいです。 先の回答で書いたのは、一般的な世界において、10進の 169 0169 00000000169 は同じですか?異なりますか?という話です。
補足
よくわかりませんが、同じ値になると思います。よろしければ詳しくこのことを教えていただけませんか?
- asuncion
- ベストアンサー率33% (2127/6289)
>010101010 と 10101010 は同じなのでしょうか? 十進数において、 169 0169 00000000169 これらの数値は同じ値を持ちますか?異なる値を持ちますか?
補足
間違っていたらごめんなさい。異なる値をもつと思います。なぜなら実際に プログラムを作り int a = 11; と宣言し、printf("a=%d", a)で出力すると a=11 と出ますが int a = 011; と宣言して、printf("a=%d", a)で出力するとなぜか a=9 と出てきてしまうからです。
- asuncion
- ベストアンサー率33% (2127/6289)
>実際になぜ 010101001 + 1 = 010101010になるのかよくわかりません。 二進数の計算について、どの程度の知識をお持ちですか?
補足
二進数を十進数に直す程度です。010101001は十進数にすると169になると思います。そう考えると010101010は170になると思うのですが、170を二進数にすると10101010となり少し混乱しています。 010101010 と 10101010 は同じなのでしょうか?
- hashioogi
- ベストアンサー率25% (102/404)
使用されているC言語の教科書に「暗黙の型変換」という項目があれば、そこを読まれたらいかがかと存じます。
- qbr2
- ベストアンサー率50% (62/123)
コンピュータでマイナスの値を保持する場合には、一般的に 「2の補数」の形式が用いられます。 詳細は割愛しますが、簡単に言うと 正の数のビットを反転して1を足すと負の数になります。 int型のデータサイズは、32ビットなので、 +3を2進数で表現すると、 00000000000000000000000000000011 -3は、+3を反転させて 11111111111111111111111111111101 -3を、負の数ではなく正の数として10進数にすると、 4294967293になります。 補数とは何か?なぜ補数表現を用いるか?等は、 情報処理試験でもよく問われる内容ですし、プログラミングの基礎ですので、 この機会に、勉強されると良いかと思います。
補足
>-3は、+3を反転させて 11111111111111111111111111111101 とあるのですが、 11111111111111111111111111111101 というのは+3を反転して 11111111111111111111111111111100 にしたものに1を足した結果なのでしょうか? もうひとつ伺いたいことがあるのですが、 ウィキベィアで 補数ついてよんだのですが、"2 の補数を求めるには、1 の補数に 1 を加算するとよい。" とあります。 "2 進法 101010110 と表される数に対する 1 の補数は 010101001 である。" これはわかるのですが実際になぜ 010101001 + 1 = 010101010になるのかよくわかりません。これは 010101001 + 1 で 1 + 1 最下位ビットが繰り上がりして隣のビットが1になるのでしょうか? 説明不足であればまた付け足しますのでよろしくおねがいします。
- asuncion
- ベストアンサー率33% (2127/6289)
>1Uの効果でunsinged型にあわせて計算している そうです。 minus3 はint型(signed int型)、1Uはunsigned int型です。 両者を使って演算する際、型をunsigned intにそろえる動きをします。 int型のminus3の内部表現(メモリー中の0と1のパターン)を 16進で書くとFFFFFFFDです。これをunsigned int型とみなすと、 お書きになったとおり4294967293となります。 minus3はあくまでint型の-3です。これは変わりません。 内部表現をint型とみなすかunsigned int型とみなすか、という話です。
お礼
そうゆことだったんですか。なるほど。よく見れば 010101010 は10101010 の前に 0 が付いているだけですね。 こんなに長く質問に付き合っていただき、ほんとうにありがとうございました。説明もとてもわかりやすく、いい勉強ができました。