2017-02-09 6 views
2

「num」はしばらくの間0になるのはなぜですか?C#For Loop Confusion

int num = 16; 
for (int i = 1; i < 1000; i++) 
{ 
    Console.WriteLine(num *= i); 
} 
+0

それが0になる前に、値が '取るnum'どういう:

これはあなたが得る配列であり、右側がしかゼロの数字の長い列を取得することに注意してください? –

+0

各操作を1行ずつ調べます。手作業で作業を行い、なぜそれが終わっているのかが分かります。 – Servy

+0

@DavidG - これは適切な答えです:)自分自身を投稿しようとしていた。あなたが投稿する価値があります:) –

答えて

0

乗算の結果が大きくなりすぎたときには、intの容量をオーバーフローしているため。

+2

'long 'は0になるのに少し時間がかかりませんか? –

+1

@ScottHunterはい、それもゼロになります。おそらくさらに早くなります。 – DavidG

+1

@ScottHunter 'long'は' int'より大きい_aロット_です。とにかく '0'に行くと、' System.Numerics'の 'BigInteger'クラスが役に立ちます。 –

2

毎回iが2の倍数である場合、それによってnを掛けて、nが多く、最後に0ビットが与えられます。最終的には変数を埋めて0にします。

+0

それは2の力だけではなく、 "左シフト"よりも、私の答えを見てください。 (ちょうど偶数でなければならない) – DavidG

+0

@DavidG:良いキャッチ。 –

4

31回目の反復では、numは既に理解しているオーバーフローのために-1073741824になります。

次の(32番目)反復では、num32(これはバイナリとしてb100000)を掛けます。この乗算は、値5ビットを左にシフトすることと同じです。

-10737418240xC0000000あり、そしてあなたが左に5ビットのことをシフトすれば、あなたの32ビット値は0x00000000 =>ゼロなってしまいます。

+0

この質問のすべての部分を結びつけるうまい方法! –

2

偶数で乗算するたびに、数字の右側に1つ以上のバイナリのゼロを追加しますが、は決してを削除します。最終的に、すべての桁がゼロである点にヒットします。

01:        10000 <= 4 zeros 
02:        100000 <= 5 zeros 
03:       1100000 <= 5 zeros 
04:       110000000 <= 7 zeros 
05:      11110000000 <= 7 zeros 
06:      10110100000000 <= 8 zeros 
07:     10011101100000000 <= 8 zeros 
08:    10011101100000000000 <= 11 zeros 
09:   10110001001100000000000 <= 11 zeros 
10:   11011101011111000000000000 <= 12 zeros 
11:  100110000100010101000000000000 <= 12 zeros 
12: 11001000110011111100000000000000 <= 14 zeros 
13:  110010100011001100000000000000 <= 14 zeros 
14: 11000011101100101000000000000000 <= 15 zeros 
15: 1110111011101011000000000000000 <= 15 zeros 
16: 1110111010110000000000000000000 <= 19 zeros 
17: 11101100110110000000000000000000 <= 19 zeros 
18: 10100111001100000000000000000000 <= 20 zeros 
19: 1101000100100000000000000000000 <= 20 zeros 
20:  101011010000000000000000000000 <= 22 zeros 
21: 10001100010000000000000000000000 <= 22 zeros 
22:  1101100000000000000000000000 <= 23 zeros 
23:  110110100000000000000000000000 <= 23 zeros 
24:  11100000000000000000000000000 <= 26 zeros 
25: 10111100000000000000000000000000 <= 26 zeros 
26:  11000000000000000000000000000 <= 27 zeros 
27: 10001000000000000000000000000000 <= 27 zeros 
28: 11100000000000000000000000000000 <= 29 zeros 
29: 1100000000000000000000000000000 <= 29 zeros 
30: 1000000000000000000000000000000 <= 30 zeros 
31: 11000000000000000000000000000000 <= 30 zeros 
+0

「num」は最初は16(0x10またはb10000)です。 –

+0

なぜ1101(小数点以下11桁)から始めるのですか? – juharr

+0

@ScottHunter私のテストコード....初期値として11で始まった...固定!あなたが何番目の番号で始まるかは関係ありません – DavidG