痔になりやすい生活習慣とは?

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 になるのでしょうか? 説明が不足ならまたつけたしますのでどうか教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (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
が同じかどうか、という話でした。
答えは、もうおわかりですね。
    • good
    • 0
この回答へのお礼

そうゆことだったんですか。なるほど。よく見れば 010101010 は10101010 の前に 0 が付いているだけですね。
こんなに長く質問に付き合っていただき、ほんとうにありがとうございました。説明もとてもわかりやすく、いい勉強ができました。

お礼日時:2009/10/27 16:44

>int a = 011;



「C言語では」先頭にゼロを付けると、8進数であるとみなすことになっています。
したがって、この値が10進で9になるのは正しいです。

先の回答で書いたのは、一般的な世界において、10進の
169
0169
00000000169
は同じですか?異なりますか?という話です。

この回答への補足

よくわかりませんが、同じ値になると思います。よろしければ詳しくこのことを教えていただけませんか?

補足日時:2009/10/26 16:38
    • good
    • 0

>010101010 と 10101010 は同じなのでしょうか?



十進数において、
169
0169
00000000169
これらの数値は同じ値を持ちますか?異なる値を持ちますか?

この回答への補足

間違っていたらごめんなさい。異なる値をもつと思います。なぜなら実際に プログラムを作り int a = 11; と宣言し、printf("a=%d", a)で出力すると a=11 と出ますが
int a = 011; と宣言して、printf("a=%d", a)で出力するとなぜか a=9 と出てきてしまうからです。

補足日時:2009/10/26 15:55
    • good
    • 0

>実際になぜ 010101001 + 1 = 010101010になるのかよくわかりません。



二進数の計算について、どの程度の知識をお持ちですか?

この回答への補足

二進数を十進数に直す程度です。010101001は十進数にすると169になると思います。そう考えると010101010は170になると思うのですが、170を二進数にすると10101010となり少し混乱しています。
010101010 と 10101010 は同じなのでしょうか?

補足日時:2009/10/26 14:08
    • good
    • 0

使用されているC言語の教科書に「暗黙の型変換」という項目があれば、そこを読まれたらいかがかと存じます。

    • good
    • 0

コンピュータでマイナスの値を保持する場合には、一般的に


「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になるのでしょうか? 説明不足であればまた付け足しますのでよろしくおねがいします。

補足日時:2009/10/26 13:00
    • good
    • 0

>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型とみなすか、という話です。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング